python flask 蓝图(Blueprint)详解

 

Blueprint

模块化

随着flask程序越来越复杂,我们需要对程序进行模块化的处理,针对一个简单的flask程序进行模块化处理

举例来说:

我们在一个py文件中写入了很多路由,

from flask import Flask

 

app=Flask(__name__)

 

@app.route('/')

def index():

    return 'index'

 

@app.route('/list')

def list():

    return 'list'

 

@app.route('/detail')

def detail():

    return 'detail'

 

if __name__=='__main__':

    app.run()

 

admin.py

 

@app.route('/')

def admin_home():

    return 'admin_home'

 

@app.route('/new')

def new():

    return 'new'

 

@app.route('/edit')

def edit():

    return 'edit'

 

@app.route('/publish')

def publish():

    return 'publish' 

 

发现app.py文件中的app直接报错,代码无法继续写下去,所以在flask程序中,使用传统的模块化是行不通的,需要flask提供一个特有的模块化处理方式,flask内置了一个模块化处理的类,即Blueprint

Blueprint概念

简单来说,Blueprint 是一个存储操作方法的容器,这些操作在这个Blueprint 被注册到一个应用之后就可以被调用,Flask 可以通过Blueprint来组织URL以及处理请求。

Flask使用Blueprint让应用实现模块化,在Flask中,Blueprint具有如下属性:

  • 一个应用可以具有多个Blueprint
  • 可以将一个Blueprint注册到任何一个未使用的URL下比如 “/”、“/sample”或者子域名
  • 在一个应用中,一个模块可以注册多次
  • Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法,它并不是必须要实现应用的视图和函数的
  • 在一个应用初始化时,就应该要注册需要使用的Blueprint

但是一个Blueprint并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中。

初识蓝图

蓝图/Blueprint对象用起来和一个应用/Flask对象差不多,最大的区别在于一个 蓝图对象没有办法独立运行,必须将它注册到一个应用对象上才能生效

使用蓝图可以分为三个步骤

1,创建一个蓝图对象

admin=Blueprint('admin',__name__) 

2,在这个蓝图对象上进行操作,注册路由,指定静态文件夹,注册模版过滤器

 

@admin.route('/')

def admin_home():

    return 'admin_home'

3,在应用对象上注册这个蓝图对象?

 

app.register_blueprint(admin,url\_prefix='/admin')

当这个应用启动后,通过/admin/可以访问到蓝图中定义的视图函数

运行机制

  • 蓝图是保存了一组将来可以在应用对象上执行的操作,注册路由就是一种操作
  • 当在应用对象上调用 route 装饰器注册路由时,这个操作将修改对象的url_map路由表
  • 然而,蓝图对象根本没有路由表,当我们在蓝图对象上调用route装饰器注册路由时,它只是在内部的一个延迟操作记录列表defered_functions中添加了一个项
  • 当执行应用对象的 register_blueprint() 方法时,应用对象将从蓝图对象的 defered_functions 列表中取出每一项,并以自身作为参数执行该匿名函数,即调用应用对象的 add_url_rule() 方法,这将真正的修改应用对象的路由表

蓝图的url前缀

  • 当我们在应用对象上注册一个蓝图时,可以指定一个url_prefix关键字参数(这个参数默认是/)
  • 在应用最终的路由表 url_map中,在蓝图上注册的路由URL自动被加上了这个前缀,这个可以保证在多个蓝图中使用相同的URL规则而不会最终引起冲突,只要在注册蓝图时将不同的蓝图挂接到不同的自路径即可

  • url_for

url_for('admin.index') # /admin/

注册静态路由

  和应用对象不同,蓝图对象创建时不会默认注册静态目录的路由。需要我们在 创建时指定 static_folder 参数。

下面的示例将蓝图所在目录下的static_admin目录设置为静态目录?

1

2

admin = Blueprint("admin",__name__,static_folder='static_admin')

app.register_blueprint(admin,url_prefix='/admin')

  现在就可以使用/admin/static_admin/ 访问static_admin目录下的静态文件了 定制静态目录URL规则 :可以在创建蓝图对象时使用 static_url_path 来改变静态目录的路由。下面的示例将为 static_admin 文件夹的路由设置为 /lib?

1

2

admin = Blueprint("admin",__name__,static_folder='static_admin',static_url_path='/lib')

app.register_blueprint(admin,url_prefix='/admin')

设置模版目录

  蓝图对象默认的模板目录为系统的模版目录,可以在创建蓝图对象时使用 template_folder 关键字参数设置模板目录?

1

admin = Blueprint('admin',__name__,template_folder='my_templates')

  注:如果在 templates 中存在和 my_templates 同名文件,则系统会优先使用 templates 中的文件 参考链接:https://stackoverflow.com/questions/7974771/flask-blueprint-template-folder

 

  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python Flask 蓝图是一种组织 Flask 应用程序的有效方式。它允许您将应用程序分解为可重用的模块,并使应用程序更易于管理和扩展。蓝图可以定义路由、视图、静态文件和模板等 Flask 应用程序中的各种组件。 以下是 Python Flask 蓝图的用法: 1. 创建蓝图 要创建蓝图,您需要使用 Flask 实例的 Blueprint() 函数。Blueprint() 函数需要两个参数:蓝图名称和蓝图文件的位置。 例如,以下代码创建了一个名为 'main' 的蓝图,并将其保存在 main.py 文件中: ``` from flask import Blueprint main_blueprint = Blueprint('main', __name__) ``` 2. 定义路由 要在蓝图中定义路由,您需要使用 Blueprint 对象的 route() 方法。该方法与 Flask 实例的 route() 方法类似。 例如,以下代码在 'main' 蓝图中定义了一个路由: ``` @main_blueprint.route('/') def index(): return 'Hello, World!' ``` 3. 注册蓝图 要在 Flask 应用程序中使用蓝图,您需要将其注册到应用程序中。可以使用 Flask 实例的 register_blueprint() 方法将蓝图注册到应用程序中。 例如,以下代码将 'main' 蓝图注册到 Flask 应用程序中: ``` from flask import Flask from main import main_blueprint app = Flask(__name__) app.register_blueprint(main_blueprint) ``` 4. 使用蓝图的静态文件和模板 蓝图也可以定义其自己的静态文件和模板。要使用蓝图的静态文件和模板,您需要在蓝图的文件夹中创建一个名为 'static' 和 'templates' 的文件夹,并将静态文件和模板放在这些文件夹中。 例如,以下代码显示了如何在蓝图中使用静态文件和模板: ``` main_blueprint = Blueprint('main', __name__, template_folder='templates', static_folder='static') @main_blueprint.route('/') def index(): return render_template('index.html') ``` 以上就是 Python Flask 蓝图的用法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值