当前位置: 首页 > news >正文

flask项目结构与蓝图【心得】

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
  • 前后端不分离,一般会使用模板引擎,所以会有 templatesstatic 这两个目录。

蓝图(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)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【设计模式】结构型-桥接模式
  • 计算机网络ppt和课后题总结(下)
  • vue2自定义指令
  • AI 边缘计算平台 - 回归开源 BeagleY-AI 简介
  • 机器学习-13-基于决策树算法构建北京市空气质量预测模型(实战)
  • 从零开始精通Onvif之获取设备信息
  • 绿联Nas docker 中 redis 老访问失败的排查
  • PhpStorm 项目部署/与git提交操作
  • java定时任务 设置开始时间、结束时间;每周一、四、六执行;并且隔n周执行。最后计算所有执行时间
  • GPT-4o:OpenAI的最新篇章与深度探索
  • 每日两题6
  • 设计高并发电商系统:每秒10000次请求的挑战与投资
  • WPF-UI布局
  • 深入探讨5种单例模式
  • 0605-JavaSE-单例模式-饿懒汉模式
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 2017届校招提前批面试回顾
  • chrome扩展demo1-小时钟
  • DataBase in Android
  • java中的hashCode
  • Logstash 参考指南(目录)
  • webpack4 一点通
  • 猴子数据域名防封接口降低小说被封的风险
  • 坑!为什么View.startAnimation不起作用?
  • 扑朔迷离的属性和特性【彻底弄清】
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 译自由幺半群
  • 字符串匹配基础上
  • 《天龙八部3D》Unity技术方案揭秘
  • Hibernate主键生成策略及选择
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ‌内网穿透技术‌总结
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (arch)linux 转换文件编码格式
  • (javascript)再说document.body.scrollTop的使用问题
  • (NSDate) 时间 (time )比较
  • (PADS学习)第二章:原理图绘制 第一部分
  • (Python) SOAP Web Service (HTTP POST)
  • (编译到47%失败)to be deleted
  • (二)c52学习之旅-简单了解单片机
  • (十八)三元表达式和列表解析
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转载)Linux 多线程条件变量同步
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .apk 成为历史!
  • .describe() python_Python-Win32com-Excel
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .Net OpenCVSharp生成灰度图和二值图
  • .Net 代码性能 - (1)
  • .NET开发不可不知、不可不用的辅助类(一)