赞
踩
目录
3-2-2 创建蓝图对象 - 在每个项目目录下的init文件内进行初始化操作
一、 Blueprints 蓝图概念
核心:对程序进行目录结构划分,实现模块化、解耦合。
Flask 用 蓝图(blueprints) 的概念来在一个应用中或跨应用制作应用组件和支持通用的模式。蓝图很好地简化了大型应用工作的方式,并提供给 Flask 扩展在应用上注册操作的核心方法。一个 Blueprint 对象与 Flask 应用对象的工作方式很像,但它确实不是一个应用,而是一个描述如何构建或扩展应用的 蓝图 。
Flask 中的蓝图不是即插应用,因为它实际上并不是一个应用——它是可以注册,甚至可以多次注册到应用上的操作集合。
蓝图作为 Flask 层提供分割的替代,共享应用配置,并且在必要情况下可以更改所注册的应用对象。它的缺点是你不能在应用创建后撤销注册一个蓝图而不销毁整个应用对象。
蓝图的基本设想是当它们注册到应用上时,它们记录将会被执行的操作。 当分派请求和生成从一个端点到另一个的 URL 时,Flask 会关联蓝图中的视图函数。
二、手动模拟蓝图模块化项目结构 - 不使用蓝图
!!!注意!!!
!!!仅仅模拟蓝图实现思路,解释为何要使用蓝图实现模块化,无法实现蓝图的执行效果!!!
2-1 目录结构
-templates -views -__init__.py -user.py -order.py -manage.py - 项目执行文件2-2 manage,py执行文件
# 导入views文件夹下__init__实例的Flask对象 from views import app if __name__ == '__main__': app.run()2-3 __init__,py文件
from flask import Flask,request app = Flask(__name__) # 必须导入,模拟蓝图注册,辅助manage执行文件内app.run()的执行 from . import account from . import order from . import user2-4 views视图文件夹下视图文件
# user.py from . import app @app.route('/user') def user(): return 'user' # order.py from . import app @app.route('/order') def order(): return 'order' ''' !!!注意!!! 存在严重的循环导入错误,程序无法执行,对views下的app对象重复导入。 '''
三、蓝图的实现方式
3-0 蓝图使用总结
- xxx = Blueprint('order',__name__) - 在视图函数内实例化蓝图对象
- 在__init__文件内注册蓝图
- Blueprint常用参数
- url_prefix - 蓝图URL前缀,类似于Django的路由分发,即在route的路径前添加url_prefix路径
- url_prefix 的两种挂载方式
- simple_page = Blueprint('simple_page', __name__,url_prefix='/pages')
- app.register_blueprint(simple_page, url_prefix='/pages')
- template_folder - 指定单独的templates文件夹路径(可自定义文件夹名),给当前蓝图对象使用。
- admin = Blueprint('admin', __name__, template_folder='templates')
- static_folder - 指定给当前蓝图对象使用的单独静态文件夹路径
- admin = Blueprint('admin', __name__, static_folder='static') - 蓝图为 /admin 把静态文件夹注册到 /admin/static 。
- url_for('admin.static', filename='style.css') 可通过反向解析生成同上的静态文件夹
- 蓝图对象的请求扩展,仅对当前蓝图有效;例如 @befort_request
3-0-1 蓝图内的构造URL
当你想要从一个页面链接到另一个页面,你可以像通常一个样使用 url_for() 函数,只是你要在 URL 的末端加上蓝图的名称和一个点( . )作为前缀:
url_for('admin.index')
此外,如果你在一个蓝图的视图函数或是模板中想要从链接到同一蓝图下另一个端点, 你可以通过对端点只加上一个点作为前缀来使用相对的重定向:
url_for('.index')
这个案例中,它实际上链接到 admin.index ,假如请求被分派到任何其它的 admin 蓝图端点。
3-1 中小型系统的蓝图使用
3-1-1 目录结构
-flask_pro - 项目根目录 -flask_test - 项目目录 -__init__.py -static -templates -views -order.py -user.py -manage.py - 项目执行文件3-1-2 视图函数内实例化蓝图对象
使用 Blueprint类 代替 Flask类 来创建基本对象。
''' 官方典例 ''' from flask import Blueprint, render_template, abort from jinja2 import TemplateNotFound # 实例化Blueprint对象 simple_page = Blueprint('simple_page', __name__, template_folder='templates') # 同Flask对象的使用方式 @simple_page.route('/', defaults={'page': 'index'}) @simple_page.route('/<page>') def show(page): try: return render_template('pages/%s.html' % page) except TemplateNotFound: abort(404) ''' view - 视图文件夹内视图文件 ''' # user.py from flask import Blueprint us = Blueprint('user',__name__) @us.route('/login') def login(): return 'login' # order.py from flask import Blueprint ord = Blueprint('order',__name__) @ord.route('/test') def test(): return 'order test'3-1-3 __init__,py内注册蓝图
from flask import Flask app = Flask(__name__) from flask_test.views import user from flask_test.views import order app.register_blueprint(user.us) app.register_blueprint(order.ord)3-1-4 manage,py 执行文件
from flask_test import app if __name__ == '__main__': app.run()3-2 大型系统的蓝图使用
3-2-1 目录结构
3-2-2 创建蓝图对象 - 在每个项目目录下的init文件内进行初始化操作
from flask import Blueprint # 创建web项目的蓝图对象,指定专属的资源文件夹和模板文件夹 web = Blueprint( 'web', __name__, template_folder='templates', static_folder='static' ) from . import views3-2-3 在总项目init文件内进行蓝图注册
from flask import Flask from .admin import admin from .web import web app = Flask(__name__) app.debug = True # 对admin项目进行路由分发 app.register_blueprint(admin, url_prefix='/admin') app.register_blueprint(web)3-2-4 项目目录下的执行文件
from pro_flask import app if __name__ == '__main__': app.run()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。