gpt4 book ai didi

python - Flask-Marshmallow 的 init_app() 真的有必要吗?

转载 作者:行者123 更新时间:2023-11-30 22:21:45 29 4
gpt4 key购买 nike

Flask-Marshmallow documentation关于 Marshmallow.init_app()

有这样的说法

Initializes the application with the extension.

code behind it似乎做了一些与 SQLAlchemy session 管理相关的重要事情:

def init_app(self, app):
app.extensions = getattr(app, 'extensions', {})

# If using Flask-SQLAlchemy, attach db.session to ModelSchema
if has_sqla and 'sqlalchemy' in app.extensions:
db = app.extensions['sqlalchemy'].db
self.ModelSchema.OPTIONS_CLASS.session = db.session
app.extensions[EXTENSION_NAME] = self

但是我已经使用和开发我的应用程序一段时间了,没有在任何地方调用 init_app ,而且它看起来工作得很好。我正在使用 SQLAlchemy、Flask-SQLAlchemy 和 Marshmallow-SQLAlchemy(以及 Flask-Marshmallow)。

我不执行 ma.init_app(app) 会导致什么问题,为什么一切似乎都能正常工作?

目前,我有一个数据库和一个schema模块; 数据库看起来像这样:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Customer(db.Model):
...

架构如下所示:

from flask_marshmallow import Marshmallow
from database import Customer

ma = Marshmallow()

class CustomerSchema(ma.ModelSchema):
class Meta:
model = Customer

在我的顶级__init__.py中,我正在这样做:

from flask import Flask
from database import db

app = Flask(__name__)
db.init_app(app)
with app.app_context():
db.create_all()
<小时/>

这是一个MVCE(放入mvce/__init__.py,使用PYTHONPATH=.FLASK_APP=mvceflask run运行,然后向localhost:5000发出POST请求将 name 表单字段设置为某项,然后发出 GET 请求以查看 Customer 是否已正确提交到数据库):

from flask import Flask, request
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///database.db"

@app.route("/")
def get():
return CustomerSchema(many=True).jsonify(Customer.query.all())
@app.route("/", methods=["POST"])
def new():
customer, errors = CustomerSchema().load(request.form)
if errors:
return errors, 400
db.session.add(customer)
db.session.commit()
return CustomerSchema().jsonify(customer)

db = SQLAlchemy()
class Customer(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)

ma = Marshmallow() # Not passing `app`
class CustomerSchema(ma.ModelSchema):
class Meta:
model = Customer

db.init_app(app)
with app.app_context():
db.create_all()
# Note that we don't ever call `ma.init_app(app)`!

最佳答案

总结对该问题的评论(非常感谢 georgexsh ):

是的,init_app是必需的,否则当您尝试 schema.load() 时会出现错误有主键的东西。此外,必须在创建任何模式之前调用它,并且必须在对 (Flask-SQLAlchemy) 数据库对象执行相同操作之后调用它。 IOW,你必须按以下顺序做事:

db = flask_sqlalchemy.SQLAlchemy()
ma = flask_marshmallow.Marshmallow()
db.init_app(app)
ma.init_app(app)
class CustomerSchema(ma.ModelSchema):
...

所以通过 app 可能更容易直接到构造函数:

db = flask_sqlalchemy.SQLAlchemy(app)
ma = flask_marshmallow.Marshmallow(app)

如果您的应用程序架构使这变得棘手(例如,您在 app 中定义 myapp/__init__.py ,但在 myapp/database.py 中定义数据库模型,在 myapp/schema.py 中定义架构),您可以移动 app 的定义到一个单独的模块,例如myapp/app.py ,然后做类似的事情

from myapp.app import app
db = flask_sqlalchemy.SQLAlchemy(app)

任何需要使用它的地方。

关于python - Flask-Marshmallow 的 init_app() 真的有必要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48542822/

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