如何在 Flask 中引用多个模型?
How do I reference multiple models in flask?
如何在 Flask 应用程序中处理和引用多个模型?
为什么我不能有超过一个模型 class、.py
文件?除了一个大 models.py
,有没有办法在 flask 中包含以下内容:
示例模型:
students.py
teachers.py
classes.py
schedules.py
...
?
是的,您可以为您的模型使用多个模块。 Flask 或 Python 中的任何内容都不会限制您使用特定的模块名称或仅使用一个模块。
如果您使用的是 Flask-SQLAlchemy,只需确保在每个对象中导入 db
对象(定义 Model
对象的 SQLAlchemy
实例)。
当你想使用一个模型时,只需从正确的模块导入它:
from students import Student
# etc.
如果您要在模型之间创建引用,或者想使用 create_all()
function,那么在 某个时候 您需要导入所有模型。将带有模型的每个模块添加到主模块将确保发生这种情况。
这是一个我想像 Django 一样构造的 flask 应用程序:
/blog_project
config.py
wsgi.py
.gitignore
/blog_app
__init__.py # where factory application resides
/users
/static
/templates
__init__.py
models.py
routes.py
views.py
/posts
/static
/templates
__init__.py
models.py
routes.py
views.py
我试图以类似于 Django project because my app became too unwieldy and difficult to maintain. I have a Factory Application function that creates the Flask app object which are registered with Flask Blueprints 的方式构建我的 Flask 应用程序。
# users/routes.py
# import
from Flask import Blueprint
from users.views import get_users
# Create Flask Blueprint object
user_pb = Blueprint(
'user_pb',
__name__,
template_folder='templates',
static_folder='strains/static'
)
@user_bp.route('/users', methods=['GET'])
def users():
return get_users()
# posts/routes.py
# import
from Flask import Blueprint
from users.posts import get_posts
# Create Flask Blueprint object
post_pb = Blueprint(
'post_pb',
__name__,
template_folder='templates',
static_folder='strains/static'
)
@user_bp.route('/posts', methods=['GET'])
def posts():
return get_posts()
# posts/models.py
# import sql-alchemy db instance created with factory application
from blog_app import db
class Post(db.Model):
"""
A simple model with a string based column 'content'.
"""
id = db.Column(db.Integer, primary_key=True)
content = db.Column(db.String(96), nullable=False)
def __repr__(self):
return f"post id: {self.id}"
# users/models.py
# import sql-alchemy db instance created with factory application
from blog_app import db
class User(db.Model):
"""
A simple model with a string based column 'name'.
"""
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(96), nullable=False)
def __repr__(self):
return f"post id: {self.name}"
这些蓝图是有助于保持路由模块化的对象,以及我如何能够创建用户和 Post 包,其中包含与应用程序特定部分相关的所有模块。例如,包将包含模型,url 将连接视图的路由,最后是呈现动态 HTML 的模板。
Flask 应用程序对象是使用 blog_app/__init__.py
中的 application factory function 创建的:
# blog_app/__init__.py
# Import package dependencies
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
# Global libraries
db = SQLAlchemy()
migrate = Migrate()
def create_app():
"""Initialize core application."""
app = Flask(__name__, instance_relative_config=False)
"""
Configure application from Config class in project-level
config.py module.
"""
app.config.from_object('yourconfig.Config')
# Initialize plugins
db.init_app(app)
migrate.init_app(app, db)
with app.app_context():
from blog_app.posts import routes as posts_routes
from blog_app.users import routes as users_routes
# Register Blueprints
app.register_blueprint(posts_routes.post_bp)
app.register_blueprint(users_routes.user_bp)
return app
从模板访问路由:
<a href="{{ url_for('posts_bp.posts') }}">Posts</a>
如何在 Flask 应用程序中处理和引用多个模型?
为什么我不能有超过一个模型 class、.py
文件?除了一个大 models.py
,有没有办法在 flask 中包含以下内容:
示例模型:
students.py
teachers.py
classes.py
schedules.py
...
?
是的,您可以为您的模型使用多个模块。 Flask 或 Python 中的任何内容都不会限制您使用特定的模块名称或仅使用一个模块。
如果您使用的是 Flask-SQLAlchemy,只需确保在每个对象中导入 db
对象(定义 Model
对象的 SQLAlchemy
实例)。
当你想使用一个模型时,只需从正确的模块导入它:
from students import Student
# etc.
如果您要在模型之间创建引用,或者想使用 create_all()
function,那么在 某个时候 您需要导入所有模型。将带有模型的每个模块添加到主模块将确保发生这种情况。
这是一个我想像 Django 一样构造的 flask 应用程序:
/blog_project
config.py
wsgi.py
.gitignore
/blog_app
__init__.py # where factory application resides
/users
/static
/templates
__init__.py
models.py
routes.py
views.py
/posts
/static
/templates
__init__.py
models.py
routes.py
views.py
我试图以类似于 Django project because my app became too unwieldy and difficult to maintain. I have a Factory Application function that creates the Flask app object which are registered with Flask Blueprints 的方式构建我的 Flask 应用程序。
# users/routes.py
# import
from Flask import Blueprint
from users.views import get_users
# Create Flask Blueprint object
user_pb = Blueprint(
'user_pb',
__name__,
template_folder='templates',
static_folder='strains/static'
)
@user_bp.route('/users', methods=['GET'])
def users():
return get_users()
# posts/routes.py
# import
from Flask import Blueprint
from users.posts import get_posts
# Create Flask Blueprint object
post_pb = Blueprint(
'post_pb',
__name__,
template_folder='templates',
static_folder='strains/static'
)
@user_bp.route('/posts', methods=['GET'])
def posts():
return get_posts()
# posts/models.py
# import sql-alchemy db instance created with factory application
from blog_app import db
class Post(db.Model):
"""
A simple model with a string based column 'content'.
"""
id = db.Column(db.Integer, primary_key=True)
content = db.Column(db.String(96), nullable=False)
def __repr__(self):
return f"post id: {self.id}"
# users/models.py
# import sql-alchemy db instance created with factory application
from blog_app import db
class User(db.Model):
"""
A simple model with a string based column 'name'.
"""
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(96), nullable=False)
def __repr__(self):
return f"post id: {self.name}"
这些蓝图是有助于保持路由模块化的对象,以及我如何能够创建用户和 Post 包,其中包含与应用程序特定部分相关的所有模块。例如,包将包含模型,url 将连接视图的路由,最后是呈现动态 HTML 的模板。
Flask 应用程序对象是使用 blog_app/__init__.py
中的 application factory function 创建的:
# blog_app/__init__.py
# Import package dependencies
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
# Global libraries
db = SQLAlchemy()
migrate = Migrate()
def create_app():
"""Initialize core application."""
app = Flask(__name__, instance_relative_config=False)
"""
Configure application from Config class in project-level
config.py module.
"""
app.config.from_object('yourconfig.Config')
# Initialize plugins
db.init_app(app)
migrate.init_app(app, db)
with app.app_context():
from blog_app.posts import routes as posts_routes
from blog_app.users import routes as users_routes
# Register Blueprints
app.register_blueprint(posts_routes.post_bp)
app.register_blueprint(users_routes.user_bp)
return app
从模板访问路由:
<a href="{{ url_for('posts_bp.posts') }}">Posts</a>