标签: mongoengine

在启动子线程时,Flask抛出'在请求上下文之外工作'

我试图在Flask应用程序中的Python中启动一个新线程.我正在做由请求触发的后台工作,但我不需要等待完成工作来响应请求.

是否可以在此次威胁中将烧瓶请求设置为进入的请求?原因是,我们对DB的查询(mongoDB前面的mongoengine)的ACL依赖于请求的用户(它从flask的请求对象中获取)以查看他们是否有权访问这些对象,并且因为请求是在子线程中不可用.

任何想法将不胜感激.

这是我现在如何处理它的伪代码,但它不起作用.

@app.route('/my_endpoint', methods=['POST'])
def my_endpoint_handler():
    #do tracking in sub-thread so we don't hold up the page
    def handle_sub_view(req):
        from flask import request
        request = req
        # Do Expensive work
    thread.start_new_thread(handle_sub_view, (request))
    return "Thanks"
Run Code Online (Sandbox Code Playgroud)

python mongoengine flask

52
推荐指数
4
解决办法
6万
查看次数

使用MongoEngine排序?

如何在MongoEngine中对查询对象进行排序,就像在常规mongodb查询中一样?

http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order

mongodb mongoengine

30
推荐指数
1
解决办法
2万
查看次数

Document中的Mongoengine creation_time属性

我正在尝试creation_time向我的文档添加属性.以下是一个例子:

import datetime

class MyModel(mongoengine.Document):
    creation_date = mongo.DateTimeField()
    modified_date = mongo.DateTimeField(default=datetime.datetime.now)
Run Code Online (Sandbox Code Playgroud)

Django模型为它们的DateTimeField对象构建了参数,例如add_now,等等,但是MongoEngine不支持这个.

我想知道这样做的最佳方法如下:

m,created = MyModel.objects.get_or_create()
if created:
    m.creation_date = datetime.datetime.now()
Run Code Online (Sandbox Code Playgroud)

或者如果有更好,更好的方式.

python django orm mongodb mongoengine

29
推荐指数
3
解决办法
1万
查看次数

具有可插入MongoDB存储问题的Django

我正在尝试使用django和mongoengine来提供只有GridFS的存储后端.我还有一个MySQL数据库.

当我从django管理员中删除时,我遇到了一个奇怪的(对我而言)错误,我想知道我是否做错了什么.

我的代码看起来像这样:

# settings.py
from mongoengine import connect
connect("mongo_storage")

# models.py
from mongoengine.django.storage import GridFSStorage
class MyFile(models.Model):
    name = models.CharField(max_length=50)
    content = models.FileField(upload_to="appsfiles", storage=GridFSStorage())
    creation_time = models.DateTimeField(auto_now_add=True)
    last_update_time = models.DateTimeField(auto_now=True)
Run Code Online (Sandbox Code Playgroud)

我能够很好地上传文件,但是当我删除它们时,似乎有些东西会破坏,mongo数据库似乎处于不可行状态,直到我手动删除所有FileDocument.objects.发生这种情况时,我无法上传文件或从django界面删除它们.

从堆栈跟踪我有:

/home/projects/vector/src/mongoengine/django/storage.py in _get_doc_with_name
        doc = [d for d in docs if getattr(d, self.field).name == name] ...
? Local vars
Variable    Value
_[1]    
[]
d   

docs    
Error in formatting: cannot set options after executing query
name    
u'testfile.pdf'
self    

/home/projects/vector/src/mongoengine/fields.py in __getattr__
        raise AttributeError 
Run Code Online (Sandbox Code Playgroud)

我是否错误地使用此功能?

更新:

感谢@ zeekay的回答,我能够得到一个工作的gridfs存储插件.我最终根本没有使用mongoengine.我把我的改编解决方案放在github上 …

django mongodb gridfs mongoengine

28
推荐指数
1
解决办法
2085
查看次数

将mongodb返回对象转换为字典

我正在使用瓶子框架和mongoengine.我有订单型号:

class OrderDetail(Option):
    orderDetailsQty = FloatField()

    def to_dict(self):
        return mongo_to_dict_helper(self)


class Order(Document):
    userName = StringField(required=True)
    orderDate = DateTimeField()
    orderStatus = ListField(EmbeddedDocumentField(Status))
    orderDetails = ListField(EmbeddedDocumentField(OrderDetail))
    orderComments = ListField(EmbeddedDocumentField(Comment))
    isActive = BooleanField()

    def to_dict(self):
        orderObj = mongo_to_dict_helper(self)
        orderDetailList = []
        for orderDetail in orderObj["orderDetails"]:
            orderDetailList.append(orderDetail.__dict__)
        orderObj["OrderDetails"] = orderDetailList
        return (self)
Run Code Online (Sandbox Code Playgroud)

当查询mongodb时,我得到一个对象,然后使用以下函数将其转换为dict:

def mongo_to_dict_helper(obj):
    return_data = []
    for field_name in obj._fields:
        if field_name in ("id",):
            continue
        data = obj._data[field_name]

        if isinstance(obj._fields[field_name], StringField):
            return_data.append((field_name, str(data)))
        elif isinstance(obj._fields[field_name], FloatField):
            return_data.append((field_name, float(data)))
        elif isinstance(obj._fields[field_name], IntField):
            return_data.append((field_name, …
Run Code Online (Sandbox Code Playgroud)

python mongodb mongoengine bottle python-2.7

28
推荐指数
4
解决办法
3万
查看次数

mongoengine - 忽略模式验证的额外字段

我正在尝试查询我的数据库.某些记录当前有额外的字段未包含在我的模型模式中(错误,但我想处理这些情况).当我尝试查询数据库并将记录转换为模式时,我收到以下错误:

FieldDoesNotExist
The field 'X' does not exist on the document 'Y'
Run Code Online (Sandbox Code Playgroud)

由于数据库中的额外字段与架构不同.

有没有办法忽略mongoengine中额外字段的模式验证?

mongodb database-schema mongoengine

28
推荐指数
2
解决办法
7013
查看次数

Django的PyMongo vs MongoEngine

对于我的一个项目,我更喜欢使用Django + Mongo.

我为什么要使用MongoEngine,而不仅仅是PyMongo?有什么好处?使用PyMongo查询会产生已经完成对象的结果,不是吗?那么MongoEngine的目的是什么?

python django mongodb pymongo mongoengine

25
推荐指数
2
解决办法
2万
查看次数

一起使用MongoEngine和PyMongo

我想将MongoEngine用于我的下一个项目.现在我想知道我是否也可以在同一个项目中直接使用PyMongo.只是因为我需要一些非常特殊的东西,不能直接通过mongoengine支持.

有没有怀疑这会起作用,或者我不应该这样做!?

mongodb pymongo mongoengine

24
推荐指数
1
解决办法
7935
查看次数

在MongoEngine中实现双向关系

我正在构建一个使用MongoDB和MongoEngine来存储数据的Django应用程序.为了呈现我的问题的简化版本,我想要有两个类:User和Page.每个页面应该与用户和每个用户关联页面.

from mongoengine import *

class Page(Document):
    pass

class User(Document):
    name = StringField()
    page = ReferenceField(Page)

class Page(Document):
    content = StringField()
    user = ReferenceField(User)
Run Code Online (Sandbox Code Playgroud)

(请注意,必须在User之前定义Page.如果我缺少处理循环依赖关系的Pythonic方法,请告诉我.)每个文档都可以创建并保存得很好,但是为用户分配页面会引发错误.

u = User(name='Jeff')
u.save()
p = Page(content="I'm a page!")
p.save()
p.user = u
p.save()
u.page = p
u.save()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "build\bdist.win32\egg\mongoengine\document.py", line 71, in save
  File "build\bdist.win32\egg\mongoengine\base.py", line 303, in validate
mongoengine.base.ValidationError: Invalid value for field of type "ReferenceField"
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么抛出这个异常,我做错了什么,以及如何避免它?

python circular-reference mongodb bidirectional-relation mongoengine

22
推荐指数
2
解决办法
4050
查看次数

如何使用mongoengine"插入如果不存在其他更新"?

我正在使用Django中的mongoengine,
这是我的文档定义:

class Location(mongoengine.Document):  
    user_id = mongoengine.IntField(required=True)  
    point = mongoengine.GeoPointField(required=True)
Run Code Online (Sandbox Code Playgroud)

我想这样做:
给定一个user_idpoint:
如果没有文件,有这个user_id,创建一个具有user_idpoint并保存;
否则用user_idwith 更新文档point.
我可以用mongoengine在一个声明中这样做吗?

python django mongodb mongoengine

21
推荐指数
3
解决办法
1万
查看次数