Использование Flask-SQLAlchemy в моделях Blueprint без ссылки на приложение [закрыто]
Я пытаюсь создать «модульное приложение» во Flask, используя Blueprints.
Однако при создании моделей я сталкиваюсь с проблемой необходимости ссылаться на приложение, чтобы получитьdb
-объект, предоставленный Flask-SQLAlchemy. Я хотел бы иметь возможность использовать некоторые чертежи с несколькими приложениями (аналогично тому, как можно использовать приложения Django), так что это не хорошее решение. *
db
экземпляр, который приложение затем импортирует вместе с остальной частью проекта. Но тогда любой другой проект, желающий создавать модели, необходимо импортировать изэто план вместо приложения.Мои вопросы таковы:
Есть ли способ позволить Blueprints определять модели, не зная о приложении, в котором они будут использоваться позже, и объединить несколько Blueprints? Под этим я подразумеваю необходимость импортировать модуль приложения / пакет из вашего Blueprint.Я ошибаюсь с самого начала? Разве Blueprints не предназначены для того, чтобы быть независимыми от приложения и распространяться (как приложения Django)?Если нет, то какой шаблондолжен Вы используете, чтобы создать что-то подобное? Расширение колб? Должны ли вы просто не делать этого - и, возможно, централизовать все модели / схемы в виде Ruby on Rails?редактировать: Я сам об этом думал сейчас, и это может быть больше связано с SQLAlchemy, чем Flask, потому что вы должны иметьdeclarative_base()
при объявлении моделей. А такжеэто в любом случае должен прийти откуда-то!
Возможно, лучшее решение - это определить схему вашего проекта в одном месте и распространить ее, как это делает Ruby on Rails. Декларативные определения классов SQLAlchemy действительно больше похожи на schema.rb, чем на Django models.py. Я полагаю, что это также облегчит использование миграций (изперегонный куб или жеSQLAlchemy-мигрирует).
Меня попросили привести пример, поэтому давайте сделаем что-то простое: скажем, у меня есть план с описанием «плоских страниц» - простого «статического» контента, хранящегося в базе данных. Он использует таблицу с кратким названием (для URL), заголовком и телом. Этоsimple_pages/__init__.py
:
from flask import Blueprint, render_template
from .models import Page
flat_pages = Blueprint('flat_pages', __name__, template_folder='templates')
@flat_pages.route('/<page>')
def show(page):
page_object = Page.query.filter_by(name=page).first()
return render_template('pages/{}.html'.format(page), page=page_object)
Тогда было бы неплохо позволить этому проекту определить свою собственную модель (это вsimple_page/models.py
):
# TODO Somehow get ahold of a `db` instance without referencing the app
# I might get used in!
class Page(db.Model):
name = db.Column(db.String(255), primary_key=True)
title = db.Column(db.String(255))
content = db.Column(db.String(255))
def __init__(self, name, title, content):
self.name = name
self.title = title
self.content = content
Этот вопрос связан с:
Импорт в Flask-SQLAlchemy / проблема контекстаКакой макет вашей папки для приложения Flask разделен на модули?И другие, но все ответы, кажется, полагаются на импорт приложенияdb
Например, или делать наоборот."Большое приложение, как" на вики-странице также используется шаблон «импортируй свое приложение в свой чертеж».
* Поскольку в официальной документации показано, как создавать маршруты, представления, шаблоны и ресурсы в Blueprint, не заботясь о том, в каком приложении оно находится, я предположил, что в общем случае Blueprints можно повторно использовать в разных приложениях. Тем не менее, эта модульность не кажетсяэто полезно, не имея также независимых моделей.
Поскольку Blueprints можно подключить к приложению более одного раза, может быть, это просто неправильный подход к использованию моделей в Blueprints?