Использование Flask-SQLAlchemy в моделях Blueprint без ссылки на приложение [закрыто]

Я пытаюсь создать «модульное приложение» во Flask, используя Blueprints.

Однако при создании моделей я сталкиваюсь с проблемой необходимости ссылаться на приложение, чтобы получитьdb-объект, предоставленный Flask-SQLAlchemy. Я хотел бы иметь возможность использовать некоторые чертежи с несколькими приложениями (аналогично тому, как можно использовать приложения Django), так что это не хорошее решение. *

Можно сделать switcharoo, и Blueprint создаст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?

Ответы на вопрос(3)

Ваш ответ на вопрос