Flask教程-组织你的 Flask 程序测试代码
Flask教程-组织你的 Flask 程序测试代码
gh_1d7504e4dee1
回复:python,领取Python面试题。分享Python教程,Python架构师教程,Python爬虫,Python编程视频,Python脚本,Pycharm教程,Python微服务架构,Python分布式架构,Pycharm注册码。
虽然我们的程序开发已经完成,但随着功能的增多,把所有代码放在 app.py 里会让后续的开发和维护变得麻烦。这一章,我们要对项目代码进行一次重构,让项目组织变得更加合理。
Flask 对项目结构没有固定要求,你可以使用单脚本,也可以使用包。这一章我们会学习使用包来组织程序。
先来看看我们目前的项目文件结构:
├──
.flaskenv
├──
app
.py
├──
test_watchlist
.py
├──
static
│ ├──
favicon
.ico
│ ├──
images
│ │ ├──
avatar
.png
│ │ └──
totoro
.gif
│ └──
style
.css
└──
templates
├── 400
.html
├── 404
.html
├── 500
.html
├──
base
.html
├──
edit
.html
├──
index
.html
├──
login
.html
└──
settings
.html
点击领取Python面试题手册
Python从入门到进阶知识手册
使用包组织代码
我们会创建一个包,然后把 app.py 中的代码按照类别分别放到多个模块里。下面是我们需要执行的一系列操作(这些操作你也可以使用文件管理器或编辑器完成):
$
mkdir watchlist
# 创建作为包的文件夹
$
mv static templates watchlist
# 把 static 和 templates 文件夹移动到 watchlist 文件夹内
$
cd
watchlist
# 切换进包目录
$
touch __init__.py views.py errors.py models.py commands.py
# 创建多个模块
我们把这个包称为程序包,包里目前包含的模块和作用如下表所示:
| 模块 | 作用 |
|---|---|
| init.py | 包构造文件,创建程序实例 |
| views.py | 视图函数 |
| errors.py | 错误处理函数 |
| models.py | 模型类 |
| commands.py | 命令函数 |
import
os
import
sys
from
flask
import
Flask
from
flask_sqlalchemy
import
SQLAlchemy
from
flask_login
import
LoginManager
# ...
app = Flask(__name__)
app.config[
’SECRET_KEY’
] =
’dev’
# 注意更新这里的路径,把 app.root_path 添加到 os.path.dirname() 中
# 以便把文件定位到项目根目录
app.config[
’SQLALCHEMY_DATABASE_URI’
] = prefix + os.path.join(os.path.dirname(app.root_path),
’data.db’
)
app.config[
’SQLALCHEMY_TRACK_MODIFICATIONS’
] =
False
db = SQLAlchemy(app)
login_manager = LoginManager(app)
@login_manager.user_loader
def
load_user
(user_id)
:
from
watchlist.models
import
User
user = User.query.get(int(user_id))
return
user
login_manager.login_view =
’login’
@app.context_processor
def
inject_user
()
:
from
watchlist.models
import
User
user = User.query.first()
return
dict(user=user)
from
watchlist
import
views, errors, commands
在构造文件中,为了让视图函数、错误处理函数和命令函数注册到程序实例上,我们需要在这里导入这几个模块。但是因为这几个模块同时也要导入构造文件中的程序实例,为了避免循环依赖(A 导入 B,B 导入 A),我们把这一行导入语句放到构造文件的结尾。同样的,load_user() 函数和 inject_user() 函数中使用的模型类也在函数内进行导入。
其他代码则按照分类分别放到各自的模块中,这里不再给出具体代码。在移动代码之后,注意添加并更新导入语句,比如使用下面的导入语句来导入程序实例和扩展对象:
from
watchlist
import
app, db
使用下面的导入语句来导入模型类:
from
watchlist.models
import
User, Movie
以此类推。
包名称这里使用了 watchlist,所以导入时要从 watchlist 包导入,如果你使用了更常规的名字,比如 app,那么导入语句也要相应变化:
from
app
import
app, db
from
app.models
import
User, Movie
组织模板
模块文件夹 templates 下包含了多个模板文件,我们可以创建子文件夹来更好的组织它们。下面的操作创建了一个 errors 子文件夹,并把错误页面模板都移动到这个 errors 文件夹内(这些操作你也可以使用文件管理器或编辑器完成):
$
cd
templates
# 切换到 templates 目录
$
mkdir errors
# 创建 errors 文件夹
$
mv 400.html 404.html 500.html errors
# 移动错误页面模板到 errors 文件夹
因为错误页面放到了新的路径,所以我们需要修改代码中的 3 处模板文件路径,以 400 错误处理函数为例:
@app.errorhandler(400)
def
bad_request
(e)
:
return
render_template(
’errors/400.html’
),
400
单元测试
你也可以将测试文件拆分成多个模块,创建一个 tests 包来存储这些模块。但是因为目前的测试代码还比较少,暂时不做改动,只需要更新导入语句即可:
from
watchlist
import
app, db
from
watchlist.models
import
Movie, User
from
watchlist.commands
import
forge, initdb
因为要测试的目标改变,测试时的 --source 选项的值也要更新为包的名称 watchlist:
(env) $ coverage run --
source
=watchlist test_watchlist.py
现在的测试覆盖率报告会显示包内的多个文件的覆盖率情况:
$ coverage report
Name Stmts Miss Cover
-------------------------------------------
watchlist
__init__
.py 25 1 96%
watchlistcommands.py 35 1 97%
watchlisterrors.py 8 2 75%
watchlistmodels.py 16 0 100%
watchlistviews.py 77 2 97%
-------------------------------------------
TOTAL 161 6 96%
启动程序
因为我们使用包来组织程序,不再是 Flask 默认识别的 app.py,所以在启动开发服务器前需要使用环境变量 FLASK_APP 来给出程序实例所在的模块路径。因为我们的程序实例在包构造文件内,所以直接写出包名称即可。在 .flaskenv 文件中添加下面这行代码:
FLASK_APP
=watchlist
最终的项目文件结构如下所示:
├──
.flaskenv
├──
test_watchlist
.py
└──
watchlist
# 程序包
├── __
init__
.py
├──
commands
.py
├──
errors
.py
├──
models
.py
├──
views
.py
├──
static
│ ├──
favicon
.ico
│ ├──
images
│ │ ├──
avatar
.png
│ │ └──
totoro
.gif
│ └──
style
.css
└──
templates
├──
base
.html
├──
edit
.html
├──
errors
│ ├── 400
.html
│ ├── 404
.html
│ └── 500
.html
├──
index
.html
├──
login
.html
└──
settings
.html
程序员交流群
扫码进群记得备注: 城市、昵称和技术方向 。
扫描下方二维码,逆袭成长
-
如何黑掉一台根本不联网的电脑
-
AI绘画-奶茶店的打工妹
-
Flask教程-测试Flask程序
-
2023年血糖新标准公布,不是3.9-6.1,快来看看你的血糖正常吗? 2023-02-07
-
2023年各省最新电价一览!8省中午执行谷段电价! 2023-01-03
-
GB 55009-2021《燃气工程项目规范》(含条文说明),2022年1月1日起实施 2021-11-07
-
PPT导出高分辨率图片的四种方法 2022-09-22
-
2023年最新!国家电网27家省级电力公司负责人大盘点 2023-03-14
-
全国消防救援总队主官及简历(2023.2) 2023-02-10
-
盘点 l 中国石油大庆油田现任领导班子 2023-02-28
-
我们的前辈!历届全国工程勘察设计大师完整名单! 2022-11-18
-
关于某送变电公司“4·22”人身死亡事故的快报 2022-04-26
