flask项目结构(三)使用蓝图
简介:
Flask中的蓝图旨在针对这些情况:
- 把一个应用分解成一系列的蓝图。对于大型的应用是理想化的;一个项目能实例化一个应用, 初始化一些扩展,以及注册一系列的蓝图。
- 以一个 URL 前缀和/或子域在一个应用上注册蓝图。 URL 前缀/子域名中的参数即成为这个蓝图下的所有视图函数的共同的视图参数(默认情况下)。
- 在一个应用中用不同的 URL 规则多次注册一个蓝图。
- 通过蓝图提供模板过滤器、静态文件、模板和其它功能。一个蓝图不一定要实现应用或视图函数。
- 初始化一个 Flask 扩展时,在这些情况中注册蓝图。
上面是官方的介绍,真深奥,还是自己解释一遍吧。
蓝图功能,就好像把一个flask项目分成了N个flask项目。用来分离route路由表。基础flask教程中,route都写在main文件中。当项目够大的时候,几百个路由,怎么写?当项目是多人团队开发的时候怎么写?当新版本上线的时候,老版本怎么兼容?
使用蓝图,就能解决上面的问题。
大概就是把@app.route()给分离成多个文件来写,方便你找到需要修改的地方。方便团队协作时,个人写个人的功能模块,写在自己的文件里。新版本和旧版本可以同时在线,通过不同的URL来调用。
一:构建蓝图
现在有两种流行的方式来分割route,来使用蓝图。
1.根据类型来分割
见过使用 api core models
分为API接口,核心代码,模型
2.根据应用来分割
我倾向于写这样的
分割为 app01 app02 app03……
见过的一般分为 auth admin main news
二:建立蓝图目录结构
从上篇的空白flask项目中继续建立目录和文件。
演示设计,把所有的蓝图分割,都按应用放在app目录下,分割为main,app01,app02.
- .
- ├── app #python项目目录-同步上传目录
- │ ├── app #所有的app目录
- │ │ ├── app01 #第一个应用
- │ │ │ └── views.py #第一个应用的视图
- │ │ ├── app02 #第二个应用
- │ │ │ └── views.py #第二个应用的视图
- │ │ └── main #主应用?默认应用?随便叫什么吧,就是首页,区别一下名字
- │ │ └── views.py #该应用的视图
- │ ├── build_requirements.py #生成requirements的程序
- │ ├── main.py #主入口
- │ └── requirements.txt #依赖包列表
- ├── dockerfile #生成docker镜像的dockerfile
- └── rebuild.sh #自动停止容器,删除容器,重建镜像,启动镜像的linux shell脚本
三:建立蓝图views
初级flask教程中,只进行了app.route的路由注册。
这里开始使用蓝点注册路由。
main.views
- from flask import Blueprint
- main=Blueprint('main',__name__)
- @main.route('/')
- def show():
- return 'main.hello'
app01.views
- from flask import Blueprint
- app01=Blueprint('app01',__name__)
- @app01.route('/')
- def show():
- return 'app01.hello'
app02.views
- from flask import Blueprint
- app02=Blueprint('app02',__name__)
- @app02.route('/')
- def show():
- return 'app02.hello'
大家会发现,我把路由都注册到了/下面。
不过它们是在不同的蓝点下面,也不冲突。
四:注册蓝图
修改main.py
把刚才注册的蓝点路由,注册到程序的主入口文件中
- from flask import Flask
from app.main.views import *
from app.app01.views import *
from app.app02.views import *- app = Flask(__name__)
app.register_blueprint(main)
app.register_blueprint(main,url_prefix='/index')
app.register_blueprint(app01,url_prefix='/app01')
app.register_blueprint(app02,url_prefix='/app02')
app.register_blueprint(app01,url_prefix='/app03')
app.register_blueprint(app02,url_prefix='/app04')
app.register_blueprint(app02)- if __name__=='__main__':
app.run()
大家会注意到,我注册了两次main,区别是url_prefix。可以理解为挂载点不同。
结合测试,和大家继续讲这些东西是怎么用的。
五:本机测试
本机测试:
运行以后,应该会提示你访问:http://127.0.0.1:5000
浏览地址 | 显示结果 | 路由位置 |
http://127.0.0.1:5000 | main.hello | main.views--@main.route('/') |
http://127.0.0.1:5000/index | main.hello | main.views--@main.route('/') |
http://127.0.0.1:5000/app01 | app01.hello | app01.views--@app01.route('/') |
http://127.0.0.1:5000/app02 | app02.hello | app02.views--@app02.route('/') |
http://127.0.0.1:5000/app03 | app01.hello | app01.views--@app01.route('/') |
http://127.0.0.1:5000/app04 | app02.hello | app02.views--@app02.route('/') |
我注册了两次main,一次注册是没有给挂载点的,一次是有挂载点的。那么这一个路由,可以由默认位置访问,也可以由挂载点访问。
不同的蓝点,使用不同的挂载点挂载后,蓝点内的挂载点不冲突。
- app.register_blueprint(main)
app.register_blueprint(app02,url_prefix='/app02')
app.register_blueprint(app02)
这三行看着貌似冲突了。main和app02都进行了默认挂载,无挂载点挂载,且挂载内部,都是挂载在‘/’下,其实并不冲突,flask并不校验这些,只是在路由里面寻找匹配的第一个路由,并返回给客户端,所以访问http://127.0.0.1:5000,返回main.hello。
而app02挂载两次匹配路由的时候,只有http://127.0.0.1:5000/app02,才是第一个匹配的路由,才可以返回app02.hello。
- app.register_blueprint(app01,url_prefix='/app01')
app.register_blueprint(app01,url_prefix='/app03')
这两行看着也是冲突的重复挂载,这就是多次注册一个蓝图,访问http://127.0.0.1:5000/app01 http://127.0.0.1:5000/app03 都是访问同一个蓝图,即app01.views--@app01.route('/')
可以多做点测试,更深入的理解一下蓝点的路由。
六:同步到服务器
syncthing教程
同步开发机的project目录到服务器的 /app
七:重建并启动镜像
上篇写好的脚本,开放端口为8800
八:测试访问
按照本机测试,替换一下IP地址,进行一下服务器测试。
flask项目结构(三)使用蓝图的更多相关文章
- 一个比较良好的flask项目结构
一个比较良好的flask项目结构 project/ app/ # 整个程序的包目录 static/ # 静态资源文件 js/ ...
- flask项目结构(四)使用sqlalchemy和alembic
简介 其实我不是啥正经人,错了,不是啥正经程序员,所能想到的估计也就码农一级吧,高级程序员,搞什么算法,什么人工智能,大数据计算…………离我还太遥远. 但是这并不妨碍我继续学习,继续写垃圾小程序. 反 ...
- flask项目结构(一)mariadb
简介: 本文主要是根据自己所学,创建一个flask项目,使用sqlalchemy,alembic,mariadb,bootstrap,APScheduler,selenium,request…………技 ...
- flask项目结构(二)创建flask,同步docker
简介: 建立flask容易,那么部署就比较麻烦了,配这个,配那个,更新………… 所以我从构建,就考虑部署的问题,使用docker部署. 程序都打包进docker,本博客有相关文章. pycharn直接 ...
- python flask 项目结构
1. 今天学习遇到一个问题,以前项目比较简单,所有的@app.route 都是写在一个文件app.py 中的,然后启动也是在这个文件中启动app.run .但是我今天 想写一个新的模块, 于是我新启了 ...
- Flask系列(三)蓝图、基于DButils实现数据库连接池、上下文管理
知识点回顾 1.子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_value,aggr): # Ani ...
- flask项目结构(五)使用数据库
简介: 基础搭建好了,开始读写数据库吧.毕竟写的程序,也没什么高深的,就是CRUD,中文说是增删改查. 一:在数据库中增加测试数据. 在项目根目录建立init_test.py from config ...
- flask项目结构(六)快速开发后台flask-admin
简介: Flask-admin 相当django的xadmin吧! 快速装配一个后台用来管理数据. Flask-admin也是有使用局限性的,他只适合开发小型快速的应用,不适合那种大型并发性高,逻辑复 ...
- Flask 项目结构(仅供参考)
project/ app/ # 整个程序的包目录 static/ # 静态资源文件 js/ # JS脚本 css/ # 样式表 img/ # 图片 favicon.ico # 网站图标 templat ...
随机推荐
- Codeforces 841 D - Leha and another game about graph
D - Leha and another game about graph 思路:首先,如果所有点的度数加起来是奇数,且没有-1,那么是不可以的. 其他情况都可以构造,我们先dfs出一个生成树,然后从 ...
- 昂达 v891 v1 终于 删除 windows 分区 并且恢复了容量。
参考了很多文章(最后列出重要的),却始终失败. 途中因为乱改分区表,竟然fastboot 都进不去了,当时真是欲哭无泪. 总结关键点: 1) partition.tbl不能把硬盘剩余空间全给data分 ...
- ubuntu 14.04 postgresql 的总结
1)为了允许远程连接: a) http://askubuntu.com/questions/423165/remotely-access-postgresql-database To open the ...
- JavaScript 第十章总结:first class functions
前言 这一章的内容是 advanced knowledge and use of functions. 讲了关于 function 的使用的一些特殊的方面. function expression 的 ...
- IOS, Android, Java Web Rest : RSA 加密和解密问题
IOS, Android, Java Web Rest : RSA 加密和解密问题 一对公钥私钥可以使用 OpenSSL创建, 通常 1024位长度够了. 注意: 1. 公钥私钥是BASE64编码的 ...
- centos6 安装python3.5后pip无法使用的处理
现象:安装pip后发现命令无法识别command not found 原因:which查看找到不到执行路径 find搜索发现安装后存放在/usr/local/python3.5/bin下,于是判断 ...
- Confluence 6 创建一个空间
在 Confluence 中并不限制你可以创建多少空间.你可以选择为你每一个小组,项目都创建一个空间,或者你也可以将这 2 者混合在一起.所有的这些都基于你的需求来决定的. 每一个 Confluenc ...
- P4426 [HNOI/AHOI2018]毒瘤
挺不错的一个题. 题意即为求一个图的独立集方案数. 如果原图是一棵树,可以直接大力f[x][0/1]来dp. 由于非树边很少,考虑2^11容斥,强制某些点必选,然后再O(n)dp,这样应该过不了. 发 ...
- 『TensorFlow』SSD源码学习_其四:数据介绍及TFR文件生成
Fork版本项目地址:SSD 一.数据格式介绍 数据文件夹命名为VOC2012,内部有5个子文件夹,如下, 我们的检测任务中使用JPEGImages文件夹和Annotations文件夹. JPEGIm ...
- SSRF漏洞
概念:服务端在获取攻击者输入的url时,如果这个过程中,服务端并没有对这个url做任何的限制和过滤,那么就很有可能存在ssrf漏洞. 漏洞利用:SSRF攻击的目标一般是外网无法访问的内部系统.攻击者可 ...