2012-05-24 4 views
0

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

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

Python Колба MongoDb-> MongoEngine Uwsgi Nginx

У меня есть две модели:

One для компании:

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

One для Кампании:

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 с "приложения/JSON" как контент- Тип. Проблема в том, когда o попробовать тот же код на производственном сервере, что он терпит неудачу, бросая следующую ошибку!

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 

Запуск " 'компания': "% s".% OBJ ДИКТ" бросает этот результат:

"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}", 

HELP! Почему это работает в dev-сервере и не работает в Uwsgi?

ответ

0

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

0

Tty добавление --lazy к вашим параметрам uWSGI. Возможно, ваш драйвер mongodb не fork() дружелюбный.

+0

Пробовал, не работал. Спасибо, в любом случае! – verrochio

0

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

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

Campaign.objects.all().select_related() 
+0

Это тот же проект. Я установил производственный сервер на dev-машине только для этих типов ошибок, и время от времени я проверяю, могу ли я видеть на рабочем сервере те же результаты, что и сервер Dev-сервера Flask. Uwsgi получает те же файлы. Я попробую это спасибо! – verrochio

+0

Попробуйте также: «компания»: «% s»% obj .__ dict__, чтобы узнать, какие данные находятся в объекте. Кажется, его не разыменовали. – Ross

+0

Сделал это, и я положил результат в тело Вопроса. – verrochio