我的烧瓶应用程序中有一个奇怪的错误。 问题是下面的代码在Flask开发服务器中工作正常,但在生产服务器(Uwsgi + Nginx)中失败。代码的目的是从mongoDb中检索整个集合,并将其内容作为JSON提供。
我没有使用virtualenv,因为我在虚拟机下工作,而且,我没有在该机器上运行任何其他项目。 堆栈就像这样:
的Python 烧瓶 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
正在运行“'公司':”%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}",
HELP!为什么这在dev服务器上工作而不在Uwsgi中工作?
答案 0 :(得分:0)
添加--lazy到您的uWSGI选项。也许你的mongodb驱动程序不是fork()友好的。
答案 1 :(得分:0)
你在开发中的mongoengine和uwsgi / nginx上有相同的版本吗?
你可以试试这个:
Campaign.objects.all().select_related()
答案 2 :(得分: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查询但现在只能使用,唯一的问题是,它很脏。