【问题标题】:Mongoengine Uwsgi Dbref attribute errorMongoengine Uwsgi Dbref 属性错误
【发布时间】:2012-05-24 16:59:58
【问题描述】:

我的烧瓶应用程序中有一个奇怪的错误。 问题是下面的代码在 Flask 开发服务器中运行良好,但在生产服务器(Uwsgi+Nginx)中失败。该代码的目的是从 mongoDb 检索整个集合并将其内容作为 JSON 提供。

我没有使用 virtualenv,因为我在虚拟机下工作,而且我没有在该机器上运行任何其他项目。 所以栈是这样的:

Python 烧瓶 MongoDb->MongoEngine 乌斯吉 NginX

我有两个模型:

公司一个:

class Company(Document):
    name = StringField(max_length=50)
    ....

一个用于广告系列:

class Campaign(Document):
    name = StringField(min_length=8)
    company = ReferenceField(Company)
    ....

路由是这样完成的:

@app.route('/getjson', methods=['GET', 'POST'])
    def getJson():
        if request.method == 'GET':
        collection = request.args.get('collection')
        if collection == 'Campaign':
            return jsonify (getCampaign())

getCampaign() 函数是这样的:

def getCampaign():
    theCollection = Campaign.objects.all()
    theDict = {}
    for obj in x:
        dict_model = {
            obj.name:
            {
            'company': obj.company.name,
            ...
            }
    theDict.update(dict_model)
return theDict

这会产生一个格式良好的 Json,其中“application/json”作为 Content-Type。问题是当你在生产服务器上尝试相同的代码时,它会惨遭失败并抛出以下错误!

    Traceback (most recent call last):
  File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 1518, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 1506, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 1504, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 1264, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 1262, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 1248, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "./mobuy.py", line 58, in getJson
    return jsonify (getCampaign())
  File "./jsonOut.py", line 36, in getCampaign
    'company': obj.company.name,
  File "/usr/local/lib/python2.6/dist-packages/bson/dbref.py", line 88, in __getattr__
     raise AttributeError(key)
  AttributeError: name

运行 " 'company': "%s" % obj.dict " 会抛出这个结果:

"company":"{'_created': False, '_data': {'status': 3, 'startDate':
datetime.datetime(2012, 5, 23, 20, 22, 28, 42000), None: ObjectId('4fbd4704f65b813c5900000d'), 
'EndDate': datetime.datetime(2012, 5, 23, 20, 22, 28, 42000), 
'name': u'Campaign13', 'max_claimed': 39, 'text': u'a discount', 
'company': DBRef(u'company', ObjectId('4fbd36f2f65b813869000008')),
'image': u'http://www.Company8.com/image.jpg', 'Shops': [],
 'category': 5, 'id': None, 'coupons': []},
 '_id': ObjectId('4fbd4704f65b813c5900000d'), '_changed_fields': [],
 '_initialised': True}",

帮助!为什么这在开发服务器中有效而在 Uwsgi 中无效??

【问题讨论】:

    标签: python mongodb flask uwsgi mongoengine


    【解决方案1】:

    Tty 将 --lazy 添加到您的 uWSGI 选项中。也许您的 mongodb 驱动程序对 fork() 不友好。

    【讨论】:

      【解决方案2】:

      你在开发中的 mongoengine 和 uwsgi / nginx 上有相同的版本吗?

      你可以试试这个:

      Campaign.objects.all().select_related()
      

      【讨论】:

      • 同一个项目。我已经在开发机器上为这些类型的错误设置了一个生产服务器,并且不时地检查我是否可以在生产服务器中看到与 Flask 的开发服务器相同的结果。 uwsgi 获取相同的文件。我会试试的,谢谢!
      • 或者尝试: 'company': "%s" % obj.__dict__ 找出 obj 中的数据。它似乎没有被取消引用。
      • 这样做了,我已将结果放入问题的正文中。
      • 和 select_related 也失败了?
      • 是的。我不知道问题出在哪里,我将尝试使用 pymongo 制作查询 sql 样式,而忽略 mongoengine 模型。
      【解决方案3】:

      我找到的解决办法是,我绕过这个问题,直接用pymongo查询数据库

      #init pymongo dor dbfer quering as uwsgi fails miserably
      connection = Connection()
      db = connection.mobuy_test
      company_collection = db.company
      campaign_collection = db.campaign
      for obj in Campaign.objects.all(): #the mongoengine queryset loop
          theId = campaign_collection.find_one({'_id':obj.id})['company'].id
          companyName = company_collection.find_one({'_id':theId})['name']
          dict_model = {
                        'campaign_name': obj.name,
                        'campaign_company':companyName
                         ...
                        }
      

      不确定我是否正确使用了 pymongo 查询,但目前可以使用,唯一的问题是,它很脏。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 2012-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多