[系列教程]使用Flask搭建一个校园论坛3-登录注册

[系列教程]使用Flask搭建一个校园论坛3-登录注册

💡 原文中文,约8100字,阅读约需20分钟。
📝

内容提要

本章介绍了使用Flask-SQLAlchemy进行数据库ORM操作和使用Click注册命令初始化项目基础数据的方法,以及使用蓝图进行用户注册功能开发的方法。

🔎

延伸解读

数据库配置的安全实践

文章将数据库连接参数保存在环境变量中,避免硬编码在代码里,这是一种常见的安全做法。同时介绍了使用.env文件配合python-dotenv自动加载,比手动export更便捷。读者需注意,.env文件不应提交到版本控制系统,否则敏感信息会泄露。

外键使用的权衡

文章在User表中使用外键关联Status、College、Role等表,并指出外键能保证数据唯一性与完整性,适合小项目提高开发效率。但若项目量大、并发高,建议将完整性维护移至业务代码,避免数据库层面外键带来的性能开销。读者应根据项目规模选择。

ORM关系查询的便利

通过db.relationship定义关系属性,可以在一对多关系中直接通过对象访问关联数据,如user.role.name或role.user集合。这简化了查询,避免了手动编写JOIN语句。但需注意,关系属性默认是懒加载,频繁访问可能产生N+1查询问题,必要时可配置加载策略。

初始化命令的谨慎使用

文章使用Click注册了flask init命令,该命令会先清空整个数据库再重建表并插入基础数据。这适用于开发阶段快速重置环境,但切勿在生产环境误用,否则会导致数据丢失。命令中通过click.confirm进行二次确认,是一种安全防护。

❓

Q&A

Flask-SQLAlchemy 在项目中是如何初始化的?

在 extensions.py 中创建 SQLAlchemy 实例 db = SQLAlchemy(),然后在 __init__.py 的 register_extensions 函数中调用 db.init_app(app) 完成初始化。

如何用 Click 命令初始化项目基础数据?

在 __init__.py 中定义 register_cmd 函数,使用 @app.cli.command() 装饰器注册 init 命令。该命令会先确认清空数据库,然后删除所有表、重新创建表,并依次初始化状态、学院、权限、角色等基础数据,最后提交。

项目配置中如何管理数据库连接参数?

在 setting.py 中定义 BaseConfig 类,通过 os.getenv() 从环境变量读取 DATABASE_USER、DATABASE_PWD、DATABASE_HOST、DATABASE_PORT 等参数。可以使用 export 命令或 .env 文件配合 python-dotenv 自动加载环境变量。

User 模型中的外键和关系是如何定义的?

User 模型通过 db.ForeignKey 定义了 status_id、college_id、role_id 三个外键,分别关联 t_status、t_college、t_role 表。同时使用 db.relationship 定义了 college、role、status 关系属性,并设置 back_populates 实现双向关系。

db.relationship() 有什么作用?

db.relationship() 用于定义表与表之间的关系属性,简化一对多关系的查询。例如,在 User 中定义 role 关系后,可以通过 user.role 直接获取角色对象;在 Role 中定义 user 关系后,可以通过 role.user 获取该角色下的所有用户集合。

用户注册功能放在哪个模块?如何注册蓝图?

用户注册功能放在 bbs/blueprint/auth.py 模块中,创建蓝图 auth_bp = Blueprint('auth', __name__, url_prefix='/auth')。创建后需要在 create_app() 函数中注册该蓝图,否则路由会找不到视图函数而报404错误。

🏷️

标签

➡️

继续阅读