Ошибка атрибута Mongoengine Uwsgi Dbref

У меня странная ошибка в моем приложении фляги. Проблема в том, что приведенный ниже код отлично работает на сервере разработки Flask, но не работает на рабочем сервере (Uwsgi+Nginx). Цель кода — извлечь всю коллекцию из mongoDb и передать ее содержимое в формате JSON.

Я не использую virtualenv, так как работаю под виртуальной машиной, а также у меня нет других проектов, работающих на этой машине. Итак, стек такой:

Python Flask MongoDb->MongoEngine Uwsgi 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?


person verrochio    schedule 24.05.2012    source источник


Ответы (3)


Добавьте --lazy к параметрам uWSGI. Возможно, ваш драйвер mongodb не поддерживает fork().

person roberto    schedule 24.05.2012

У вас одинаковые версии на mongoengine в разработке и на uwsgi/nginx?

Не могли бы вы попробовать это:

Campaign.objects.all().select_related()
person Ross    schedule 24.05.2012
comment
Это тот же проект. Я настроил рабочий сервер на машине разработки только для таких типов ошибок и время от времени проверяю, вижу ли я на рабочем сервере те же результаты, что и на сервере разработки Flask. uwsgi получает те же файлы. Я попробую это спасибо! - person verrochio; 24.05.2012
comment
В качестве альтернативы попробуйте: 'company': %s % obj.__dict__, чтобы узнать, какие данные находятся в obj. Кажется, его не разыменовывают. - person Ross; 24.05.2012
comment
Сделал это, и я поместил результат в тело вопроса. - person verrochio; 25.05.2012
comment
и select_related также не удалось? - person Ross; 25.05.2012
comment
да. я не знаю, в чем проблема, я попытаюсь сделать этот стиль SQL запроса с pymongo, игнорируя модель mongoengine. - person verrochio; 26.05.2012

Решение, которое я нашел, заключается в том, что я обошел проблему и напрямую запросил базу данных с помощью 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, но пока это работает, проблема только в том, что это грязно.

person verrochio    schedule 26.05.2012