2014-01-07 2 views
2

У меня есть следующая очень простое приложение:RuntimeError при запуске простой flask_restful приложения на Google App Engine

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 создаются один раз и могут вызываться сервером несколько раз. Из TRACEBACK, это выглядит как конкретизация должно происходить в контексте запроса, поэтому я завернула его, как это:

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 и добавил flask-restful в качестве зависимости в requirements.txt, а затем просто добавил более или менее код, который у вас был выше, и он работал без проблем. Я добавил репозиторий на my github here, если вы хотите его использовать - вы можете увидеть изменения, которые я сделал для скелета в this commit.

Я не уверен, почему ваш пример не работает, но одна вещь, которую я заметил, может вызвать проблемы, заключается в том, что вы делаете from lib.flask .... Кажется, ваши сторонние пакеты живут в lib, и вы не обязательно «подняли» lib в свой sys.path. Скелет содержит vendoring library, который гарантирует, что это правильно обработано. Это может быть потенциальным источником проблемы.

В любом случае, я надеюсь, что раздвоенный скелет может помочь вам встать и работать.

+0

Большое спасибо, я попробую. Я добавляю 'lib' в' sys.path', поэтому это не должно быть проблемой. – bigblind

+0

По какой-то странной причине выполнение 'from flask import Flask', а также для других библиотек исправлено. Похоже, просто работает 'import flask' ​​и' import flask_restful' также работает. Просто не 'из импортной фляжки и т. Д. – bigblind

+0

Рад, что вы смогли решить проблему @bigblind. –

Смежные вопросы