python flask-restful не может получить доступ к приложению в классе ресурсов

Вот пример кода из колбы-спокойного документа

from flask import Flask
from flask.ext import restful

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

class HelloWorld(restful.Resource):
    def get(self):
        return {'hello': 'world'}

api.add_resource(HelloWorld, '/')

if __name__ == '__main__':
    app.run(debug=True)

HelloWorld класс находится в том же файле Python, скажем, app.py, оно работает.

Теперь я собираюсь поставить HelloWorld Класс в отдельный файл класса, как следующий макет:

app
app/__init__.py # hold above code except the HelloWorld class.
app/resource
app/resource/__init__.py # empty
app/resource/HelloWorld.py # hold the above HelloWorld class.

app/__init__.py содержит:

from flask import Flask
from flask.ext import restful
from resource.HelloWorld import HelloWorld

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

api.add_resource(HelloWorld, '/')

if __name__ == '__main__':
    app.run(debug=True)

И HelloWorld.py является:

from flask.ext import restful
from app import app

class HelloWorld(restful.Resource):
    def get(self):
        return {'hello': 'world'}

Запуск приложения получит исключение:

ImportError: No module named app on HelloWorld.py

Мне нужно получить доступ к приложению, чтобы прочитать некоторую информацию, такую ​​как app.configКак я могу заставить его работать?

1 ответ

Решение

У вас есть круговой импорт; когда линия from resource.HelloWorld import HelloWorld выполняет, app еще не был назначен, поэтому в Helloworld.py линия from app import app выходит из строя.

Либо импорт HelloWorld потом:

from flask import Flask
from flask.ext import restful

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

from resource.HelloWorld import HelloWorld
api.add_resource(HelloWorld, '/')

if __name__ == '__main__':
    app.run(debug=True)

или импортировать только app модуль в HelloWorld.py:

from flask.ext import restful
import app

class HelloWorld(restful.Resource):
    def get(self):
        return {'hello': 'world'}

и обратитесь к app.app внутри функции или метода, вызываемого позднее.

Другие вопросы по тегам