Как правильно подключать import'ы во Flask?

Есть следующая структура проекта:
  • app
    • __init__.py
    • items.py
    • REST
      • __init__.py
      • books.py






app/__init__.py
from app.REST import mod_books

app = Flask(__name__)
db = SQLAlchemy(app)

app.register_blueprint(mod_books, url_prefix='/books')


app/REST/__init__.py
mod_books = Blueprint("books", __name__)
books_api = restful.Api(mod_books)

from app.REST import books


app/REST/books.py
from app.REST import books_api
from app import db
from app.items import Book, Author

...
class BooksListApi(Resource):
...
books_api.add_resource(BooksListApi, '/')
...


В двух словах: в app есть объект db, в app.REST объявлен blueprint, который импортируется и подключается в app

Мне нужно получить доступ из app.REST.books к объекту db из app, чтобы работать с базой данных.

Как можно правильно оформить эту структуру, чтобы не возникало цикличных зависимостей?
  • Вопрос задан
  • 2651 просмотр
Пригласить эксперта
Ответы на вопрос 2
Teivaz
@Teivaz
Я только вчера столкнулся с этой проблемой.
Достаточно в одном месте написать не from A import B, а from A import *, например, в REST/books.py:
from app import *
Ответ написан
Комментировать
@ykalchevskiy
Посмотрите в сторону этих репозиториев:
https://github.com/sloria/cookiecutter-flask
https://github.com/imwilsonxu/fbone

В них более сложная структура проекта, но и более удобная. Логически разделены: создание приложение, создание расширений, регистрация Blueprints и расширений и многое другое. Посмотрите в файлы "app.py". Сначала это может показаться оверхедом, но поверьте, практически наверняка, ваш проект разрастется, добавятся новые части, но эта структура останется неизменной, и проект будет выглядеть стройно и понятно.
Первый репозиторий особенно хорош тем, что он является шаблоном для cookiecutter (https://github.com/audreyr/cookiecutter). Если вы не сталкивались с этим приложением, то обязательно попробуйте, так как это может сильно упростить создание начальной структуры проектов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы