首页 > 行业资讯 > Flask教程-组织你的 Flask 程序测试代码

Flask教程-组织你的 Flask 程序测试代码

时间:2023-07-06 来源: 浏览:

Flask教程-组织你的 Flask 程序测试代码

点击关注 Python架构师
Python架构师

gh_1d7504e4dee1

回复:python,领取Python面试题。分享Python教程,Python架构师教程,Python爬虫,Python编程视频,Python脚本,Pycharm教程,Python微服务架构,Python分布式架构,Pycharm注册码。

收录于合集
#python web教程 8
#Flask教程 9
#flask开源项目 9
#Python爬虫 86
#python教程 98
整理: python架构师

虽然我们的程序开发已经完成,但随着功能的增多,把所有代码放在 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 命令函数

创建程序实例,初始化扩展的代码放到包构造文件里(init.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程序

版权:如无特殊注明,文章转载自网络,侵权请联系cnmhg168#163.com删除!文件均为网友上传,仅供研究和学习使用,务必24小时内删除。
相关推荐