网站首页 > 技术文章 正文
很多人觉得 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 总是报错,表已存在。
折腾了好久,最后实在找不到答案的情况下,福至心灵的改了下连接方式,果然
就正常了,虽然还是由警告,但是也比诡异的出错强。
说的有点杂,但是都是一把辛酸泪啊。
写到这里,基本的目录架子也算有了,剩下的就是我们继续优化我们的功能代码,
功能目录,但愿在需求变更的时候,我们能更有效率。
猜你喜欢
- 2024-10-03 不改一行代码!快速部署流行框架到腾讯云 Serverless
- 2024-10-03 Flask 基础理解(flask基础入门)
- 2024-10-03 AI界最危险武器GPT-2使用指南:从Finetune到部署
- 2024-10-03 解决Flask-SocketIO部署遇到的问题
- 2024-10-03 Python Web 部署(pythonweb服务器部署)
- 2024-10-03 Python Flask 大型应用的架构(python的flask案例)
- 2024-10-03 python 解析二维码(ZBar) flask开发 Dockerfile 打包部署
- 2024-10-03 使用Docker部署Python Flask Web应用的最佳实践
- 2024-10-03 带你认识 flask 错误处理(flask errorhandler)
- 2024-10-03 使用 Python 和 Flask 架设网站:入门指南
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)