2014-01-07 32 views
2

我有以下幾個非常簡單的應用程序:RuntimeError運行在谷歌應用程序引擎的簡單flask_restful應用時

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 

這仍然引起了同樣的錯誤。發生了什麼事情,它們是什麼意思「請求上下文」,以及如何解決這個問題?

回答

1

我從頭開始使用App Engine Flask Skeleton開始和requirements.txt添加flask-restful的依賴,然後只增加了更多或更少你有上面的代碼和它的工作沒有問題。如果您想使用它,我將庫添加到my github here - 您可以看到我對this commit中的骨架所做的更改。

我不知道爲什麼你的例子不起作用,但我注意到可能導致問題的一件事是你在做from lib.flask ...。看起來你的第三方包裝生活在lib,你不一定「lib」提升到你的sys.path。該骨架包括一個vendoring library,確保正確處理。這可能是問題的潛在根源。

無論哪種方式,我希望叉骨骼可以幫助你起牀和運行。

+0

非常感謝,我會嘗試一下。我將'lib'添加到'sys.path',所以不應該是問題。 – bigblind

+0

出於某種奇怪的原因,做'從瓶子進口燒瓶',和其他圖書館一樣修復它。看起來只是做'進口瓶'和'進口flask_restful'也可以。只是沒有'從lib導入燒瓶'等 – bigblind

+0

很高興你能解決它,@bigblind。 –