在个人flask中,咱们能够利用蓝图对程序目录的划分。css
思考若是咱们有不少个视图函数,好比下面这样咱们是否是应该抽取出来专门的py文件进行管理呢?html
from flask import Flask app = Flask(__name__) @app.route('/login/') def login(): return "login" @app.route('/logout/') def logout(): return "logout" @app.route('/add_order/') def add_order(): return "add_order" @app.route('modify_order') def modify_order(): return "modify_order" if __name__ == '__main__': app.run()
上面的这种是否是会显得主运行文件特别乱,这个时候咱们的蓝图就闪亮登场了。python
项目目录:web
-templates -static -views -user.py -order.py -app.py
views/user.pyflask
from flask import Blueprint # 1 建立蓝图 user_bp = Blueprint('user',__name__) # 2 利用蓝图建立路由关系 @user_bp.route('/login/') def login(): return "login" @user_bp.route('/logout/') def logout(): return "logout"
views/order.pyapp
from flask import Blueprint order_bp = Blueprint('order',__name__) @order_bp.route('/add_order/') def add_order(): return "add_order" @order_bp.route('/modify_order/') def modify_order(): return "modify_order"
app.pydom
from flask import Flask from views.user import user_bp from views.order import order_bp app = Flask(__name__) # 3 注册蓝图 app.register_blueprint(user_bp) app.register_blueprint(order_bp) if __name__ == '__main__': app.run()
访问:函数
其余的几条路由也是直接访问,在此就不作展现了。url
讲解:spa
观察views/user.py
咱们能够把全部的视图函数抽出来多个文件。
在这里咱们经过user_bp = Blueprint('user',__name__)
建立一个蓝图对象
参数讲解:
‘user’
用于url_for
翻转url
时使用。__name__
用于寻找蓝图自定义的模板和静态文件使用。蓝图对象的用法和以前实例化出来的app对象用法很像,能够进行注册路由。
观察app.py
关键词:
建立蓝图
user_bp = Blueprint('user',__name__)
利用蓝图建立路由关系
@bp.route('/login/') def login(): return "login"
注册蓝图 app.register_blueprint(bp)
建立蓝图的时候填写url_prefix
能够为增长url的path部分的前缀,能够更方便的去管理访问视图函数。
from flask import Blueprint # 1 建立蓝图 user_bp = Blueprint('user',__name__,url_prefix='/user') # 注意斜杠跟视图函数的url连起来时候不要重复了。
注意:
2.url加前缀的时候也能够再注册蓝图的时候加上,更推荐这么作,由于代码的可读性更强。
Copyapp.register_blueprint(user_bp,url_prefix='/order')
建立蓝图的时候填写template_folder
能够指定自定义模板路径
# 1 建立蓝图 #所对应的参数路径是相对于蓝图文件的 user_bp = Blueprint('user',__name__,url_prefix='/user',template_folder='views_templates')
注意:
蓝图虽然指定了自定义的模板查找路径,可是查找顺序仍是会先找主app规定的模板路径(templates),找不到再找蓝图自定义的模板路径。
Blueprint
的template_folder
参数指定的自定义模板路径是相对于蓝图文件的路径。
图解:
(01)
(02)
建立蓝图的时候填写static_folder
能够指定自定义静态文件的路径
user_bp = Blueprint('user',__name__,url_prefix='/user',template_folder='views_templates', static_folder='views_static')
注意:
url_for()
url_for('建立蓝图时第一个参数.蓝图下的函数名') # 如: url_for('user.login')
{{ url_for('建立蓝图时第一个参数.蓝图下的函数名') }} # 如: {{ url_for('user.login') }}
{{ url_for('建立蓝图时第一个参数.static',filename='蓝图自定义静态文件路径下的文件') }} # 如: {{ url_for('user.static',filename='login.css') }}
建立蓝图的时候填写subdomain
能够指定子域名,能够参考以前注册路由中实现子域名。
(1) 配置C:\Windows\System32\drivers\etc\hosts
127.0.0.1 bookmanage.com 127.0.0.1 admin.bookmanage.com
(2)给app增长配置
app.config['SERVER_NAME'] = 'bookmanage.com:5000'
(3)建立蓝图的时候添加子域名 subdomain='admin'
# 1 建立蓝图 user_bp = Blueprint('user',__name__,url_prefix='/user',template_folder='views_templates', static_folder='views_static',subdomain='admin') # 2 利用蓝图建立路由关系 @user_bp.route('/login/') def login(): return render_template('login_master.html')
(4) 访问admin.bookmanage.com:5000/user/login/
在蓝图中咱们能够利用建立好的蓝图对象,设置访问蓝图的视图函数的时候触发蓝图独有的请求扩展。
例如:
order_bp = Blueprint('order',__name__) @order_bp.route('/add_order/') def add_order(): return "add_order" @order_bp.before_request def order_bp_before_request(): return '请登陆'
注意:
目录结构:
-flask_small_pro -app01 -__init__.py -static -templates -views -order.py -user.py -manage.py __init__.py from flask import Flask from app01.views.user import user_bp from app01.views.order import order_bp app = Flask(__name__) app.register_blueprint(user_bp,url_prefix='/user') app.register_blueprint(order_bp)
user.py
from flask import Blueprint user_bp = Blueprint('user',__name__) @user_bp.route('/login/') def login(): return 'login' @user_bp.route('/logout/') def logout(): return 'logout'
order.py
from flask import Blueprint order_bp = Blueprint('order',__name__) @order_bp.route('/add_order/') def add_order(): return 'buy_order' @order_bp.route('/modify_order/') def modify_order(): return 'modify_order'
manage.py
from app01 import app if __name__ == '__main__': app.run()
这里所谓的大型系统并非绝对的大型系统,而是相对规整的大型系统,至关于提供了一个参考,在真实的生成环境中会根据公司的项目以及需求,规划本身的目录结构。
文件路径:
│ run.py │ │ └─pro_flask # 文件夹 │ __init__.py │ ├─admin # 文件夹 │ │ views.py │ │ __init__.py │ │ │ ├─static # 文件夹 │ └─templates # 文件夹 │ └─web # 文件夹 │ views.py │ __init__.py │ ├─static # 文件夹 └─templates # 文件夹
run.py 启动app
from pro_flask import app if __name__ == '__main__': app.run()
__init__.py
实例化核心类,导入蓝图对象,注册蓝图。
from flask import Flask from .admin import admin from .web import web app = Flask(__name__) app.debug = True app.register_blueprint(admin, url_prefix='/admin') app.register_blueprint(web)
admin.views.py 完成注册路由以及视图函数
from . import admin @admin.route('/index') def index(): return 'Admin.Index'
admin.__init__.py
生成蓝图对象导入views,使得views的代码运行完成注册路由
from flask import Blueprint admin = Blueprint( 'admin', __name__, template_folder='templates', static_folder='static' ) from . import views
web文件夹下和admin文件夹下目录构成彻底一致,这里就不举例子了
from werkzeug.wsgi import DispatcherMiddleware from werkzeug.serving import run_simple from flask import Flask, current_app app1 = Flask('app01') app2 = Flask('app02') @app1.route('/index') def index(): return "app01" @app2.route('/index2') def index2(): return "app2" # http://www.oldboyedu.com/index # http://www.oldboyedu.com/sec/index2 dm = DispatcherMiddleware(app1, { '/sec': app2, }) if __name__ == "__main__": run_simple('localhost', 5000, dm)