这看起来很奇怪,但是当删除文档中的元素并尝试从 GridFS 中删除 _id(删除产品 + 其图像)时,它给了我一个错误,因为删除的图片不是元素的图片!id
我使用name of the user
+制作的图片time.time
这是代码:
class VentesHandler(BaseHandler):
@tornado.web.authenticated
def get(self):
user = self.get_secure_cookie("mechtari")
info = tornado.escape.json_decode(user)
email = info["personnel"]["email"]
try:
produits = self.db.users.find({"personnel.email":email}, {"produit_up":1,"_id":0}).distinct("produit_up")
renderer = self.fs
print str(self.db.users.find({"personnel.pseudo":"alucaard"}).distinct("produit_up"))
print str(self.fs.list())
except (errors.AutoReconnect, errors.ConnectionFailure):
print "hopla"
self.redirect("/error")
try:
self.render("ventes.html", produits=produits, renderer=renderer)
except gridfs.errors.NoFile, e:
self.write(str(e))
class Supprimer(BaseHandler):
@tornado.web.authenticated
def post(self):
debut = time.clock()
prod = self.get_arguments("supprime")
produ = prod[0][:]
idd = self.db.users.find_one({"produit_up.spec.id":produ})["produit_up"][0]["avatar"]["photo"]
print idd
try:
self.db.users.update({"produit_up.spec.id":produ}, {"$pull":{"produit_up"{"spec.id":produ}}})
self.fs.delete(ObjectId('{0}'.format(idd)))
print str(self.db.users.find({"personnel.pseudo":"alucaard"}).distinct("produit_up"))
print str(self.fs.list())
except (errors.AutoReconnect, errors.ConnectionFailure):
self.redirect("/error")
print time.clock() - debut
self.redirect("/ventes")
模板:
{% for produit in produits %}
<div class="produit">
<span class="nom">Le nom du produit: {{produit["spec"]["namep"]}}</span>
{% if produit["spec"]["nombre"] != 0 %}
<span class="quantite">Le nombre de produits disponible: {{produit["spec"]["nombre"]}} </span>
{% else %}
<span class="quantite"><em>RUPTURE DE STOCK!</em></span>
{% end %}
<span class="prix">Son prix: {{produit["spec"]["prix"]}} DA ({{produit["spec"]["prix"]*100}} Centimes)</span>
<span class="description">Description: {{produit["spec"]["description"]}}</span>
<span class="date">Publié le {{produit["spec"]["date"]}}</span>
<span class="site"><a href="{{produit["spec"]["id"]}}">Page du Produit</a></span>
{% from bson import ObjectId %}
{% if produit["avatar"]["orientation"]=="portrait" %}
<span><img src="/{{renderer.get(ObjectId(produit["avatar"]["photo"])).filename}}" height="250px" class="imag">
{% else %}
<span><img src="/{{renderer.get(ObjectId(produit["avatar"]["photo"])).filename}}" width="250px"class="imag">
{% end %}
<div class="supprimer" >
<form name="supprimer" class="supprimer" method="post" action="/supprimer">
{% raw xsrf_form_html() %}
<input type="hidden" value="{{produit["spec"]["id"]}}" name="supprime"/>
<script>function miaw()
{
return confirm("Voulez-Vous vraiment SUPPRIMER le produit DÉFINITIVEMENT!")
}
</script>
<input type="submit" value="SUPPRIMER!" onclick="return miaw()"/>
</form>
</div>
</div>{% end %}{% end %}
这是结果,没有删除,所以,在代码的第一次执行中:
[{u'spec': {u'description': u'vend nokia 3310 du top', u'tags': [u'nokia', u'portable', u'solide'], u'vendu': False, u'prix': 1000, u'abus': 0, u'namep': u'nokia 3310', u'date': u'2012-09-25', u'nombre': 1, u'id': u'alucaard134859865997'}, u'avatar': {u'photo': ObjectId('5061fb833a5f3a09f4be0e22'), u'avctype': u'image/jpeg', u'orientation': u'portrait'}}, {u'spec': {u'description': u'iphone foooooooort', u'tags': [u'iphone', u'apple', u'3g'], u'vendu': False, u'prix': 20000, u'abus': 0, u'namep': u'iphone 3gs', u'date': u'2012-09-25', u'nombre': 1, u'id': u'alucaard134859872247'}, u'avatar': {u'photo': ObjectId('5061fbc23a5f3a09f4be0e24'), u'avctype': u'image/jpeg', u'orientation': u'portrait'}}, {u'spec': {u'description': u'bajoooooooot', u'tags': [u'206', u'hdi', u'peugeot'], u'vendu': False, u'prix': 500000, u'abus': 0, u'namep': u'peugeot 206', u'date': u'2012-09-25', u'nombre': 1, u'id': u'alucaard134859875565'}, u'avatar': {u'photo': ObjectId('5061fbe33a5f3a09f4be0e26'), u'avctype': u'image/jpeg', u'orientation': u'paysage'}}]
[u'134859845728-nopic.jpg', u'134859865997-nokia.jpg', u'134859872247-apple-iphone-3-gs.jpg', u'134859875565-peugeot.jpg']
仅删除列表中的第一个元素时(添加的最新元素,此处为 NokIa 3310):
代码:
print str(self.db.users.find({"personnel.pseudo":"alucaard"}).distinct("produit_up"))
给出:
[{u'spec': {u'description': u'iphone foooooooort', u'tags': [u'iphone', u'apple', u'3g'], u'vendu': False, u'prix': 20000, u'abus': 0, u'namep': u'iphone 3gs', u'date': u'2012-09-25', u'nombre': 1, u'id': u'alucaard134859872247'}, u'avatar': {u'photo': ObjectId('5061fbc23a5f3a09f4be0e24'), u'avctype': u'image/jpeg', u'orientation': u'portrait'}}, {u'spec': {u'description': u'bajoooooooot', u'tags': [u'206', u'hdi', u'peugeot'], u'vendu': False, u'prix': 500000, u'abus': 0, u'namep': u'peugeot 206', u'date': u'2012-09-25', u'nombre': 1, u'id': u'alucaard134859875565'}, u'avatar': {u'photo':ObjectId('5061fbe33a5f3a09f4be0e26'), u'avctype': u'image/jpeg', u'orientation': u'paysage'}}]
和代码:
print str(self.fs.list())
[u'134859845728-nopic.jpg', u'134859872247-apple-iphone-3-gs.jpg', u'134859875565-peugeot.jpg']
但是当试图删除不是第一个的产品时,这里还有 2 个产品,iphone 和 peugeot,所以让我们删除 peugeot:
[{u'spec': {u'description': u'iphone foooooooort', u'tags': [u'iphone', u'apple', u'3g'], u'vendu': False, u'prix': 20000, u'abus': 0, u'namep': u'iphone 3gs', u'date': u'2012-09-25', u'nombre': 1, u'id': u'alucaard134859872247'}, u'avatar': {u'photo': ObjectId('5061fbc23a5f3a09f4be0e24'), u'avctype': u'image/jpeg', u'orientation': u'portrait'}}]
[u'134859845728-nopic.jpg', u'134859875565-peugeot.jpg']
错误是:
no file in gridfs collection Collection(Database(Connection('localhost', 27017), u'essog'), u'fs.files') with _id ObjectId('5061fbc23a5f3a09f4be0e24')
如您所见,它似乎没有删除正确的图片!