很多人觉得 flask 不适合做大型项目,其实这是不对的,flask 不仅做小众网站强悍,

做大型网站也毫不逊色。一个好的目录结构,对整个项目的影响是深远的,尤其是对

维护开发人员,更是阅读友好,方便查阅修改的。

注:这里说的适不适合做大型项目,完全只是从目录结构考虑的,不考虑插件等,

不接受杠精反驳

给大家看一下我的目录结构:


给大家简单聊一下各个模块的作用

myblog(项目名)下有 app, logs, migrations, venv 四个文件夹或模块

app 下面是按照功能模块进行划分的,比如article是和文章相关的功能,

auth 是登录认证相关功能,comment是相关评论功能等

logs 是项目的日志文件

migrations 是数据库迁移相关

venv 项目的虚拟环境

manager.py 是项目的入口,目前用作开发调试,

后期会维护一个wsgi.py 方便用gunicorn近期启动管理

对于目录结构可能还有更好的设计,我们把目录功能拆的那么细,那么项目

是如何串起来的呢。这个才是关键。

蓝图

把各个功能模块串起来,其实蓝图功不可没,首先在功能模块中创建一个蓝图


然后把这个蓝图对象articles_bp 在app上进行注册


这时候有人会问,如果有多个模块的话,扩展起来每次都要修改application.py里的

configure_blueprint函数,这样有点麻烦,有没有简单一点的办法呢,答案当然是有的了

自己写一个实现自动注册的功能就好了。可以通过 importlib.import_module来进行

动态导入模块,我们的蓝图对象知道一个规则,命名统一以XXX开头或结尾,然后通过

分析该模块是是否有蓝图对象,来实现自动注册功能。这里就不赘述了。

通过以上的操作 ,我们就把各个功能模块串联在一起了。

日志

日志配置也很重要,一个好的日志,对定位问题有巨大的帮助。

我这里用的日志策略是按天划分,一天一个日志, 默认保存一个月以内的日志,

下面给大家看一下代码。


数据库迁移

我们总希望部署能够简单,所幸,我们找到了数据库迁移工具包flask_migrate, 使用也很简单。

flask db init # 初始化工具,并生成一个migrations文件夹

flask db migrate # 生成迁移文件,也就是migrations下面的version文件夹里的文件

这些文件都是具体执行的动作指令,比如创建表啊类似等


flask db upgrade # 执行数据库操作动作,实际上就是执行上图中upgrade()函数,

来操作数据库, 比如上图有个create_table 你就能明白,这是一个创建表的动作。

执行完成之后,可以检查数据库是否有这个表生成。

然而实际上我们经常和flask_script一起使用,比如:


使用命令方式相应改为上图注释中所示那样。

数据迁移的坑

最初连接数据库是用mysql+pymysql 这种方式,但是这样会有一个warning

心里不爽,经过一番搜索,找到一个答案,改成了 mysql+mysqlconnector这种

方式,果然不报warning,心里美滋滋。

然后再做数据迁移的时候,我发现第一次迁移生成的迁移文件还算正常,

什么创建表之类的,但是当我更改数据库模型,准备升级数据库的时候,

我发现,这种连接方式有个严重的问题,导致我通过

flask db migrate生成的迁移文件,每次都是创建表,

而在运行flask db upgrade 总是报错,表已存在。

折腾了好久,最后实在找不到答案的情况下,福至心灵的改了下连接方式,果然

就正常了,虽然还是由警告,但是也比诡异的出错强。

说的有点杂,但是都是一把辛酸泪啊。

写到这里,基本的目录架子也算有了,剩下的就是我们继续优化我们的功能代码,

功能目录,但愿在需求变更的时候,我们能更有效率。