我有一个Flask服务,可以使用默认的Flask Web服务器完美运行。我正试图用uWSGI托管它,但是在那个环境中,我遇到了一些问题,我无法在pickle中访问一些必需的数据。
这是我的主要WSGI脚本:
from collections import namedtuple
from search_service import app
SomeNamedTuple = namedtuple('SomeNamedTuple ', 'idx data')
if __name__ == "__main__":
app.run()
在我的Flask服务中,我正在做这样的事情:
unpickled_data = None
@app.before_first_request
def startup():
global unpickled_data
with open('data.pickle', 'rb') as handle:
unpickled_data = pickle.load(handle)
无论我如何尝试定义namedtuple(在wsgi.py中,在我的Flask API中等等),我最终都会收到此错误:
[2017-12-09 19:40:57,209] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
File "/home/ringham/app/appenv/lib/python3.5/site-packages/flask/app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "/home/ringham/app/appenv/lib/python3.5/site-packages/flask/app.py", line 1607, in full_dispatch_request
self.try_trigger_before_first_request_functions()
File "/home/ringham/app/appenv/lib/python3.5/site-packages/flask/app.py", line 1654, in try_trigger_before_fi
rst_request_functions
func()
File "./service.py", line 44, in startup
min_eval_data = pickle.load(handle)
AttributeError: Can't get attribute 'SomeNamedTuple ' on <module '__main__' (built-in)>
我可能会遗失什么?
答案 0 :(得分:0)
我不确定这是否能回答您的问题,但是我在腌制一个命名元组时遇到了类似的问题,因为我正在做一个游戏,并且有一个单独的关卡设计器程序,该程序使用命名元组来存储数据。对于网格上的每个单元。无需过多介绍程序,我基本上必须在游戏的全局范围内声明命名的元组,才能正确加载关卡数据。
起初,我在main()
函数中声明了命名元组,但是如果不抛出pickle.load
,它就不会AttributeError
我的关卡数据,但是当我移动命名元组声明时在main()
之外的全局范围内,级别数据加载良好。我仍然不知道为什么。也许需要在全局范围内声明命名元组?在我的关卡设计师中,这是全球性的。
我对Flask一无所知,但请尝试在您的Flask服务的全局范围内声明SomeNamedTuple = namedtuple('SomeNamedTuple ', 'idx data')
。