[Flask] 使用蓝图将路由模块分拆
2018-08-16 本文已影响49人
_小老虎_
解决:防止大型flask项目单个路由文件过大,并且不好管理项目
Flask 用 蓝图(blueprints)
的概念来在一个应用中或跨应用制作应用组件和支持通用的模式。蓝图很好地简化了大型应用工作的方式,并提供给 Flask 扩展在应用上注册操作的核心方法。一个Blueprint 对象与Flask 应用对象的工作方式很像,但它确实不是一个应用,而是一个描述如何构建或扩展应用的蓝图 。
Flask 中的蓝图
为这些情况设计:
- 把一个应用分解为一个蓝图的集合。这对大型应用是理想的。一个项目可以实例化一个应用对象,初始化几个扩展,并注册一集合的蓝图。
- 以 URL 前缀和/或子域名,在应用上注册一个蓝图。 URL 前缀/子域名中的参数即成为这个蓝图下的所有视图函数的共同的视图参数(默认情况下)。
- 在一个应用中用不同的 URL 规则多次注册一个蓝图。
- 通过蓝图提供模板过滤器、静态文件、模板和其它功能。一个蓝图不一定要实现应用或者视图函数。
初始化一个 Flask 扩展时,在这些情况中注册一个蓝图。
Flask 中的蓝图不是即插应用,因为它实际上并不是一个应用——它是可以注册,甚至可以多次注册到应用上的操作集合。为什么不使用多个应用对象?你可以做到那样(见应用调度 ),但是你的应用的配置是分开的,并在 WSGI 层管理。
蓝图作为 Flask 层提供分割的替代,共享应用配置,并且在必要情况下可以更改所注册的应用对象。它的缺点是你不能在应用创建后撤销注册一个蓝图而不销毁整个应用对象。
蓝图使用方法:
测试项目结构:
| mod1 —— | - __init__.py
| - mod1_route.py
- flasktest.py
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
from flask import Flask
from flask import render_template
from flask import session, redirect, url_for, escape, request as flaskrequest
from flask import Response as flaskresponse
from flask import g
# gevent
#from gevent import monkey
#from gevent.pywsgi import WSGIServer
#monkey.patch_all()
# gevent end
import time
import base64, zlib
import json
import re
import socket
import os
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
app = Flask(__name__)
app.config.update(DEBUG=True)
################ mod1 router
from mod1.mod1_route import mod1
app.register_blueprint(mod1,url_prefix='/mod1')
#获取本机电脑名
myname = socket.getfqdn(socket.gethostname( ))
#获取本机ip
myaddr = socket.gethostbyname(myname)
myport = 8912
@app.route('/test1')
def the_test1():
print "test1 print start"
time.sleep(10)
print "test1 print after sleep"
return 'hello asyn'
@app.route('/test2')
def the_test2():
print "test2 print!"
return 'test2 return'
if __name__ == '__main__':
print "==========>>>>>>> Start Server IP:{0}".format(str(myaddr))
#app.run(host=myaddr,port=myport,debug=False,threaded=True) ### threaded开启以后 不需要等队列
app.run(host=myaddr,port=myport,debug=False,threaded=False) ### threaded关闭以后 需要等待上一个请求结束
#http_server = WSGIServer((myaddr, myport), app)
#http_server.serve_forever()
- mod1/mod1_route.py
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
from flask import Flask
from flask import render_template
from flask import session, redirect, url_for, escape, request as flaskrequest
from flask import Response as flaskresponse
from flask import g
import time
import base64, zlib
import json
import re
import socket
import os
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from flask import Blueprint
mod1 = Blueprint('mod1',__name__)
@mod1.route('/test/test1')
def index():
return "/mod1/test1"
## footer