【问题标题】:RuntimeError when running a simple flask_restful app on Google App Engine在 Google App Engine 上运行简单的 flask_restful 应用程序时出现 RuntimeError
【发布时间】:2015-02-06 09:02:56
【问题描述】:

我有以下非常简单的应用程序:

from lib.flask import Flask

from lib.flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)


class TestResource(Resource):
    def get(self):
        return {"a":"b","c":"d"}
api.add_resource(TestResource, "/")

当我运行它时,我得到以下异常:

Traceback (most recent call last):
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/runtime/wsgi.py", line 266, in Handle
    result = handler(dict(self._environ), self._StartResponse)
  File "/Users/me/dev/project/src/main.py", line 22, in do_in_request
    app(*args, **kwargs)
  File "/Users/me/dev/project/src/lib/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/me/dev/project/src/lib/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/Users/me/dev/project/src/lib/flask_restful/__init__.py", line 249, in error_router
    if self._has_fr_route():
  File "/Users/me/dev/project/src/lib/flask_restful/__init__.py", line 230, in _has_fr_route
    if self._should_use_fr_error_handler():
  File "/Users/me/dev/project/src/lib/flask_restful/__init__.py", line 211, in _should_use_fr_error_handler
    adapter = self.app.create_url_adapter(request)
  File "/Users/me/dev/project/src/lib/flask/app.py", line 1601, in create_url_adapter
    return self.url_map.bind_to_environ(request.environ,
  File "/Users/me/dev/project/src/lib/werkzeug/local.py", line 338, in __getattr__
    return getattr(self._get_current_object(), name)
  File "/Users/me/dev/project/src/lib/werkzeug/local.py", line 297, in _get_current_object
    return self.__local()
  File "/Users/me/dev/project/src/lib/flask/globals.py", line 20, in _lookup_req_object
    raise RuntimeError('working outside of request context')
RuntimeError: working outside of request context

所以我尝试将我的整个应用程序放入我认为的请求上下文中。在上面的代码中,Flask 对象和 Api 对象都被实例化了一次,并且可以被服务器多次调用。从回溯来看,实例化似乎应该发生在请求上下文中,所以我将它包装成这样:

def do_in_request(*args, **kwargs):
    from lib.flask import Flask

    from lib.flask_restful import Resource, Api

    app = Flask(__name__)
    api = Api(app)


    class TestResource(Resource):
        def get(self):
            return {"a":"b","c":"d"}
    api.add_resource(TestResource, "/")

    app(*args, **kwargs)

app = do_in_request

这仍然会引发同样的错误。发生了什么,“请求上下文”是什么意思,我该如何解决?

【问题讨论】:

    标签: python google-app-engine flask-restful


    【解决方案1】:

    我从头开始使用App Engine Flask Skeleton 并添加flask-restful 作为requirements.txt 中的依赖项,然后或多或少地添加了上面的代码,它可以正常工作。如果你想使用它,我将存储库添加到my github here - 你可以在this commit 中看到我对骨架所做的更改。

    我不确定为什么您的示例不起作用,但我注意到可能导致问题的一件事是您正在做from lib.flask ...。看来您的第三方软件包位于lib 中,而您不一定将lib“提升”到您的sys.path 中。骨架包含一个vendoring library,可确保正确处理。这可能是问题的潜在根源。

    无论哪种方式,我希望分叉的骨架可以帮助您启动和运行。

    【讨论】:

    • 非常感谢,我会试试看。我将lib 添加到sys.path,所以这不应该是问题。
    • 出于某种奇怪的原因,执行from flask import Flask,其他库也修复了它。看起来只是做import flaskimport flask_restful 也可以。只是不是from lib import flask 等。
    猜你喜欢
    • 2012-11-21
    • 2021-06-12
    • 2013-12-20
    • 2019-10-08
    • 2014-03-11
    • 2020-09-26
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多