Flask中的蓝图旨在针对这些状况:python
上面是官方的介绍,真深奥,仍是本身解释一遍吧。linux
蓝图功能,就好像把一个flask项目分红了N个flask项目。用来分离route路由表。基础flask教程中,route都写在main文件中。当项目够大的时候,几百个路由,怎么写?当项目是多人团队开发的时候怎么写?当新版本上线的时候,老版本怎么兼容?docker
使用蓝图,就能解决上面的问题。shell
大概就是把@app.route()给分离成多个文件来写,方便你找到须要修改的地方。方便团队协做时,我的写我的的功能模块,写在本身的文件里。新版本和旧版本能够同时在线,经过不一样的URL来调用。flask
如今有两种流行的方式来分割route,来使用蓝图。api
见过使用 api core models服务器
分为API接口,核心代码,模型app
我倾向于写这样的函数
分割为 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脚本
初级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地址,进行一下服务器测试。