uWSGI:不能使用namedtuple - “无法获取属性”错误吗?

时间:2017-12-09 19:48:01

标签: python flask uwsgi

我有一个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)>

我可能会遗失什么?

1 个答案:

答案 0 :(得分:0)

我不确定这是否能回答您的问题,但是我在腌制一个命名元组时遇到了类似的问题,因为我正在做一个游戏,并且有一个单独的关卡设计器程序,该程序使用命名元组来存储数据。对于网格上的每个单元。无需过多介绍程序,我基本上必须在游戏的全局范围内声明命名的元组,才能正确加载关卡数据。

起初,我在main()函数中声明了命名元组,但是如果不抛出pickle.load,它就不会AttributeError我的关卡数据,但是当我移动命名元组声明时在main()之外的全局范围内,级别数据加载良好。我仍然不知道为什么。也许需要在全局范围内声明命名元组?在我的关卡设计师中,这是全球性的。

我对Flask一无所知,但请尝试在您的Flask服务的全局范围内声明SomeNamedTuple = namedtuple('SomeNamedTuple ', 'idx data')