--- template: overrides/blogs.html tags: - python --- # 解读FlaskBB源码 !!! info 作者:Void,发布于2021-10-29,阅读时间:约6分钟,微信公众号文章链接:[:fontawesome-solid-link:](https://mp.weixin.qq.com/s/ctAdVwr1CdzRSPQfrRVGPQ) ## 1 前言 上回[基于FlaskBB自建论坛](https://mp.weixin.qq.com/s/Bsoc0rj14ma3luKjvR_9qQ)说到FlaskBB是一个开源的功能强大的论坛,我们也已经成功地在本地运行了起来。不止于此,本文将带着大家解读FlaskBB的源码。 ## 2 目录结构 我们首先来看看它的目录结构。
在根目录下,可以看到有常见的依赖相关的文件(requirements.txt,setup.py等),也有刚刚通过flaskbb makeconfig生成的flaskbb.cfg。tests文件夹存放了自动测试相关的代码。对于一个产品级的应用,自动测试是不可或缺的。 最后是主文件夹flaskbb。 ## 3 源码解读 我们来看看flaskbb的主程序app.py中的create_app函数: ```python def create_app(config=None, instance_path=None): app = Flask( "flaskbb", instance_path=instance_path, instance_relative_config=True ) # instance folders are not automatically created by flask if not os.path.exists(app.instance_path): os.makedirs(app.instance_path) configure_app(app, config) configure_celery_app(app, celery) configure_extensions(app) load_plugins(app) configure_blueprints(app) configure_template_filters(app) configure_context_processors(app) configure_before_handlers(app) configure_errorhandlers(app) configure_migrations(app) configure_translations(app) app.pluggy.hook.flaskbb_additional_setup(app=app, pluggy=app.pluggy) return app ``` 在configure_app里FlaskBB首先加载了配置信息。FlaskBB会依次尝试从默认配置、用户配置和环境变量中导入配置信息。configure_extensions初始化了用到的相关Flask扩展。configure_blueprints初始化了Blueprint,包括user、forum、auth、management。以上四块内容挂载在不同的url下,它们是整个结构的四大重要板块。还有处理error的configure_errorhandlers,在Jinja2模板中添加过滤器的configure_template_filters等模块。 看完了最重要的app.py。我们可以看到同一目录下有刚刚提到的user、forum、auth、management四个文件夹。让我们来看看这四大板块是如何构造的。
我们打开user文件夹的models.py,这一文件定义了用户这一模块中,用户、群组等关系。这边需要提到一个对象关系映射(ORM,Object Relational Mapping)的概念。简单理解ORM是指用程序语言来定义的数据库。 ```python class User(db.Model, UserMixin, CRUDMixin): __tablename__ = "users" id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(200), unique=True, nullable=False) email = db.Column(db.String(200), unique=True, nullable=False) _password = db.Column('password', db.String(120), nullable=False) ``` 字段的定义看上去比较直接,那么我们如何来定义关系呢?比如用户和主题的一对多关系。一个用户可能会发起多个主题。在User这个class下,我们可以看到有如下代码。 ```python topics = db.relationship( "Topic", backref="user", primaryjoin="User.id == Topic.user_id", lazy="dynamic" ) ``` 如此定义会在User中创建topics这一字段,也会在Topic这一表中创建user这一字段。连接查询时的条件为User.id == Topic.user_id。 代码中还定义了删除、保存等常规操作。 四大模块都有models,views,forms三个子模块。整体的结构是非常清晰的。和大部分Flask项目类似,html模板依然放在templates文件夹下,js,css,图片等放在static文件夹下。最开始提到的tests文件夹存放了自动测试的模块。 ## 4 总结 通过FlaskBB的源码,我们学习了一个成熟的,产品级的项目的结构以及不同模块的内容。总体而言,它的代码非常工整、规范、可读性较强。我们可以在此基础之上,根据我们的需求魔改内容,使之成为一个真正可用的论坛产品。