gpt4 book ai didi

python - Flask-SQLAlchemy 导入/上下文问题

转载 作者:IT老高 更新时间:2023-10-28 21:07:14 25 4
gpt4 key购买 nike

我想构建我的 Flask 应用程序,如下所示:

./site.py
./apps/members/__init__.py
./apps/members/models.py

apps.members 是一个 Flask 蓝图。

现在,为了创建模型类,我需要拥有应用程序,例如:

# apps.members.models
from flask import current_app
from flaskext.sqlalchemy import SQLAlchemy

db = SQLAlchemy(current_app)

class Member(db.Model):
# fields here
pass

但如果我尝试将该模型导入我的蓝图应用程序,我会得到可怕的 RuntimeError: working outside of request context。如何在此处正确获取我的应用程序?相对导入可能有效,但它们非常丑陋并且有自己的上下文问题,例如:

from ...site import app

# ValueError: Attempted relative import beyond toplevel package

最佳答案

flask_sqlalchemy 模块不必立即使用应用程序初始化 - 您可以这样做:

# apps.members.models
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Member(db.Model):
# fields here
pass

然后在您的应用程序设置中,您可以调用 init_app:

# apps.application.py
from flask import Flask
from apps.members.models import db

app = Flask(__name__)
# later on
db.init_app(app)

这样可以避免循环导入。

此模式需要您将所有模型放在一个文件中。只需将 db 变量导入每个模型模块。

示例

# apps.shared.models
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

# apps.members.models
from apps.shared.models import db

class Member(db.Model):
# TODO: Implement this.
pass

# apps.reporting.members
from flask import render_template
from apps.members.models import Member

def report_on_members():
# TODO: Actually use arguments
members = Member.filter(1==1).all()
return render_template("report.html", members=members)

# apps.reporting.routes
from flask import Blueprint
from apps.reporting.members import report_on_members

reporting = Blueprint("reporting", __name__)

reporting.route("/member-report", methods=["GET","POST"])(report_on_members)

# apps.application
from flask import Flask
from apps.shared import db
from apps.reporting.routes import reporting

app = Flask(__name__)
db.init_app(app)
app.register_blueprint(reporting)

注意:这是一个草图它给你的一些力量 - 显然你可以做更多的事情来使开发更更容易(使用 create_app 模式,在某些文件夹中自动注册蓝图等)

关于python - Flask-SQLAlchemy 导入/上下文问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9692962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com