奇妙に思えますが、ドキュメント内の要素を削除し、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']
しかし、最初の製品ではない製品を削除しようとすると、ここでは iphone とプジョーの 2 つの製品が残っているので、プジョーを削除します。
[{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')
ご覧のとおり、右の写真は削除されていないようです。