GridFS元素不遵循Document元素

时间:2012-09-29 14:27:11

标签: tornado pymongo gridfs

它看起来很奇怪,但是当删除文档中的元素并尝试从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&eacute; 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删除了正确的图片!

1 个答案:

答案 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

所以这就是我删除第一个元素时没有收到错误的原因!