flask 项目没有标准的项目结构,合理组织,确保能跑,可配置,可拓展、模型可被发现就行。
一般可以分为两种
-
按模型(业务)划分
-
按功能划分,就是api、models、config、db、service等
按模型(业务)划分
project /
|-- user /
| |-- __init__.py # 主路由及自路由注册
| |-- apis.py # 用户相关接口
| |-- models.py
|-- testcase /
| |-- __init__.py # 暴露内部的模型
| |-- apis.py # 模型基础类
| |-- models.py # 用户相关模型
|-- config.py # 数据库、插件等配置
|-- app.py # 应用创建及启动
按功能划分
project /
|-- apis /
| |-- __init__.py # 主路由及自路由注册
| |-- base.py # 接口基础配置
| |-- user.py # 用户相关接口
| |-- testcase.py
|-- models /
| |-- __init__.py # 暴露内部的模型
| |-- base.py # 模型基础类
| |-- user.py # 用户相关模型
| |-- testcase.py
|-- config.py # 数据库、插件等配置
|-- app.py # 应用创建及启动
在实际开发过程中,web项目可分为
- 前后端分离 会有一个路由
routes
暴露出来 ,也可能叫api
。 - 前后端不分离,一般会使用模板引擎,所以会有
templates
和static
这两个目录。
蓝图(Blueprint)介绍
在 flask
中,路由有一个嵌套功能,用来管理路由与视图函数关系。
Blueprint('api', __name__, url_prefix='/api')
每个蓝图里面包含 路由 、 视图函数、模板文件、静态文件等。可以按业务划分蓝图,也可以按功能划分蓝图。- 蓝图还能嵌套蓝图 。
其实就是类比于 express
中的路由前缀区分模块。只是更灵活,可以多层嵌套
from flask import Flask, Blueprint , url_for , redirect
app = Flask(__name__)
api_bp = Blueprint('api', __name__, url_prefix='/api') # 接口根路由(蓝图)
user_bp = Blueprint('user', __name__, url_prefix='/user') # 用户接口路由(蓝图)
@user_bp.route('/list')
def user_list():
'''
最终接口地址为 /api/user/list
:return: 用户列表
'''
return "用户列表"
@app.route("/")
def main():
user_list_url = url_for('api.user.user_list')
return redirect(user_list_url)
# 注册用户接口路由(蓝图)到api
api_bp.register_blueprint(user_bp)
# 注册主接口路由(蓝图)到app,这里的顺序,一定要注意,app注册蓝图一定要放到最后面,否则嵌套不生效
app.register_blueprint(api_bp)
if __name__ == "__main__":
app.run(
host="0.0.0.0",
port=5611,
debug=True
)
注意点:嵌套路由时,根路由蓝图注册一定要放到所有 注册蓝图 的最后面,不然嵌套路由会失效。
app.register_blueprint(xxx_bp)