Skip to main content
 首页 » 编程设计

python之在 Google App Engine 上运行简单的 flask_restful 应用程序时出现 RuntimeError

2025年05月04日24Free-Thinker

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

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 

这仍然会引发相同的错误。这是怎么回事,“请求上下文”是什么意思,我该如何解决这个问题?

请您参考如下方法:

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

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

无论哪种方式,我希望 fork 骨架可以帮助您入门和运行。