它看起来很奇怪,但是当删除文档中的元素并尝试从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):
thr代码:
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和标致,所以让我们删除标致:
[{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')
所以你可以看到它,似乎它的dident删除了正确的图片!
答案 0 :(得分:0)
解决!
这是我的表现:
list(db.users.find({"produit_up.spec.id":"alucaard134859872247"}).distinct("produit_up.spec"))
Out[13]:
[{u'abus': 0,
u'date': u'2012-09-25',
u'description': u'vend nokia 3310 du top',
u'id': u'alucaard134859865997',
u'namep': u'nokia 3310',
u'nombre': 1,
u'prix': 1000,
u'tags': [u'nokia', u'portable', u'solide'],
u'vendu': False},
{u'abus': 0,
u'date': u'2012-09-25',
u'description': u'iphone foooooooort',
u'id': u'alucaard134859872247',
u'namep': u'iphone 3gs',
u'nombre': 1,
u'prix': 20000,
u'tags': [u'iphone', u'apple', u'3g'],
u'vendu': False},
{u'abus': 0,
u'date': u'2012-09-25',
u'description': u'bajoooooooot',
u'id': u'alucaard134859875565',
u'namep': u'peugeot 206',
u'nombre': 1,
u'prix': 500000,
u'tags': [u'206', u'hdi', u'peugeot'],
u'vendu': False}]
list(db.users.find({"produit_up.spec.id":"alucaard134859872247"}).distinct("produit_up.spec.id"))
Out[14]: [u'alucaard134859865997', u'alucaard134859872247', u'alucaard134859875565']
因此解决方案是替换:
idd = self.db.users.find_one({"produit_up.spec.id":produ})["produit_up"][0]["avatar"]["photo"]
通过
idd = self.db.users.find_one({"produit_up.spec.id":produ})["produit_up"][0]["avatar"]["photo"]
抱歉:D
所以这就是我删除第一个元素时没有收到错误的原因!