Использование Flask-SQLAlchemy в моделях Blueprint без ссылки на приложение [закрыто]
я пытаюсь создатьмодульное приложение " в колбе с помощью чертежей.
Однако при создании моделей ям сталкивается с проблемой необходимости ссылаться на приложение, чтобы получитьdb
-объект, предоставленный Flask-SQLAlchemy. Я'Я хотел бы иметь возможность использовать некоторые чертежи с несколькими приложениями (аналогично тому, как можно использовать приложения Django), так что это не очень хорошее решение. *
db
экземпляр, который приложение затем импортирует вместе с остальной частью проекта. Но тогда любой другой проект, желающий создавать модели, необходимо импортировать изтот план вместо приложения.Мои вопросы таковы:
Есть ли способ позволить Blueprints определять модели, не зная о приложении, которое онииспользуется позже - и несколько чертежей собрались вместе? Под этим я подразумеваю необходимость импортировать модуль приложения / пакет из вашего Blueprint.Я ошибаюсь с самого начала? Чертежи не предназначены для того, чтобы быть независимыми от приложения и быть распространяемыми ( La Django Apps)?Если нет, то какой шаблондолжен Вы используете, чтобы создать что-то подобное? Расширение колб? Если вы просто не сделаете этого - и, возможно, централизуете все модели / схемы à ла Ruby on Rails?редактировать: ЯЯ думал об этом сейчас сам, и это может быть больше связано с SQLAlchemy, чем Flask, потому что вы должны иметьdeclarative_base()
при объявлении моделей. А такжеэто в любом случае должен прийти откуда-то!
Возможно, лучшее решение - это иметь свой проект »Схема определена в одном месте и распространена, как в Ruby on Rails. Декларативные определения классов SQLAlchemy действительно больше похожи на schema.rb, чем на Django 's models.py. Я полагаю, что это также облегчит использование миграций (изперегонный куб или жеSQLAlchemy-мигрирует).
Меня попросили привести пример, так что давайтесделать что-то простое: скажем, у меня есть план с описанием "flatpages» -- просто, "статический» содержимое хранится в базе данных. Он использует таблицу с кратким названием (для 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('/')
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?