flask蓝图具体使用及介绍示例

1. 最基本的蓝图示例。

复制代码
from flask import Blueprint, render_template, abort
from jinja2 import TemplateNotFound

simple_page = Blueprint('simple_page', __name__,
                        template_folder='templates')

@simple_page.route('/', defaults={'page': 'index'})
@simple_page.route('/<page>')
def show(page):
  return "response is ok"

#当你使用 @simple_page.route 装饰器绑定一个函数时,蓝图会记录下所登记的 show 函数。当以后在应用中注册蓝图时,这个函数会被注册到应用中。另外,
它 会把构建 Blueprint 时所使用的名称(在本例为 simple_page )作 为函数端点的前缀。蓝图的名称不修改 URL ,只修改端点。
复制代码
复制代码
Blueprint参数讲解
Blueprint(   #默认参数  
  name: str, #蓝图名,别名
  import_name: str, #蓝图所在的‘包(package)’的名字,有助于定位蓝图的根路径
static_folder: t.Optional[t.Union[str, os.PathLike]] = None, #蓝图静态文件目录,默认情况下禁用
#手动指定static_url_path时,如果static_url_path不为空串,url的路径必须以/开头,如/static
#手动指定static_url_path时,如果static_url_path为空串,url路径不必以/开头,否则相当于static_url_path=None的情况,也就是使用static_folder的目录名字。
   static_url_path: t.Optional[str] = None,
  template_folder: t.Optional[str] = None,#模板路径(相对于蓝图的相对路径)
url_prefix: t.Optional[str] = None, #附加到所有蓝图的url路径的前缀,相当于 “路由” = “url_prefix/蓝图下路由”
subdomain: t.Optional[str] = None,
url_defaults: t.Optional[dict] = None,#蓝图路由默认值字典
root_path: t.Optional[str] = None,#手动指定蓝图的根路径
cli_group: t.Optional[str] = _sentinel, # type: ignore
)
复制代码

2. 注册蓝图

from flask import Flask
from yourapplication.simple_page import simple_page

app = Flask(__name__)
app.register_blueprint(simple_page)
复制代码
register_blueprint方法参数介绍
register_blueprint(
blueprint,#蓝图名字
url_prefix#路由前缀
复制代码

3. 嵌套蓝图

概念:把一个蓝图注册在另一个蓝图上

parent = Blueprint('parent', __name__, url_prefix='/parent')
child = Blueprint('child', __name__, url_prefix='/child')
parent.register_blueprint(child)
app.register_blueprint(parent)

子蓝图会把父蓝图的名称作为其前缀,子 URL 也会把父 URL 作为前缀。

url_for('parent.child.create')
/parent/child/create

父蓝图指定的请求前函数等会为子蓝图触发。如果子蓝图没有可以处理异常的出错 处理器,那么会尝试父蓝图的出错处理。

4 . 蓝图资源

蓝图还可以用于提供资源。有时候,我们仅仅是为了使用一些资源而使用蓝图

4.1 蓝图资源文件夹  

和普通应用一样,蓝图一般都放在一个文件夹中。虽然多个蓝图可以共存于同一个文 件夹中,但是最好不要这样做。

文件夹由 Blueprint 的第二个参数指定,通常为 __name__ 。这个参数 指定与蓝图相关的逻辑 Python 模块或包。如果这个参数指向的是实际的 Python 包 (文件系统中的一个文件夹),那么它就是资源文件夹。如果是一个模块,那么这个 模块包含的包就是资源文件夹。可以通过 Blueprint.root_path 属性来查 看蓝图的资源文件夹:

simple_page.root_path
'/Users/username/TestProject/yourapplication'

可以使用 open_resource() 函数快速打开这个文件夹中的资源:

with simple_page.open_resource('static/style.css') as f:
    code = f.read()

4.2 静态文件

蓝图的第三个参数是 static_folder 。这个参数用以指定蓝图的静态文件所在的 文件夹,它可以是一个绝对路径也可以是相对路径。:

admin = Blueprint('admin', __name__, static_folder='static')

缺省情况下,路径最右端的部分是在 URL 中暴露的部分。这可以通过 static_url_path 来改变。因为上例中的文件夹为名称是 static ,那么 URL 应该是蓝图的 url_prefix 加上 /static 。 如果蓝图注册前缀为 /admin ,那么静态文件URL 就是 /admin/static 。

端点的名称是 blueprint_name.static 。你可以像对待应用中的文件夹一样 使用 url_for() 来生成其 URL:

url_for('admin.static', filename='style.css')

但是,如果蓝图没有 url_prefix ,那么不可能访问蓝图的静态文件夹。 这是因为在这种情况下,URL应该是 static ,而应用程序的 static 路线优先。与模板文件夹不同,如果文件不存在于应用静态文件夹中,那么不会 搜索蓝图静态文件夹。

4.3 模板

如果你想使用蓝图来暴露模板,那么可以使用 Blueprint 的 template_folder 参数:

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

对于静态文件,路径可以是绝对的或相对于蓝图的资源文件夹。

模板文件夹被添加到模板的搜索路径,但优先级低于实际应用的模板文件夹。这样就 可以轻松地重载在实际应用中蓝图提供的模板。这也意味着如果你不希望蓝图模板出 现意外重写,那么就要确保没有其他蓝图或实际的应用模板具有相同的相对路径。 多个蓝图提供相同的相对路径时,第一个注册的优先。

假设你的蓝图便于 yourapplication/admin 中,要渲染的模板是 'admin/index.html' , template_folder 参数值为 templates ,那么 真正的模板文件为: yourapplication/admin/templates/admin/index.html 。多出一个 admin 文件夹是为了避免模板被实际应用模板文件夹中的 index.html 重载。

更详细一点说:如果你有一个名为 admin 的蓝图,该蓝图指定的模版文件是 index.html ,那么最好按照如下结构存放模版文件:

yourpackage/
    blueprints/
        admin/
            templates/
                admin/
                    index.html
            __init__.py

这样,当你需要渲染模板的时候就可以使用 admin/index.html 来找到模板。 如果没有载入正确的模板,那么应该启用 EXPLAIN_TEMPLATE_LOADING 配置变量。 启用这个变量以后,每次调用 render_template 时, Flask 会打印出定位模板的 步骤,方便调试。

5. 创建URL

如果要创建页面链接,可以和通常一样使用 url_for() 函数,只是要把蓝图 名称作为端点的前缀,并且用一个点( . )来分隔:

url_for('admin.index')

另外,如果在一个蓝图的视图函数或者被渲染的模板中需要链接同一个蓝图中的其他 端点,那么使用相对重定向,只使用一个点使用为前缀:

url_for('.index')

如果当前请求被分配到 admin 蓝图端点时,上例会链接到 admin.index 。

6. 蓝图出错处理器

蓝图像 Flask 应用对象一样支持 errorhandler 装饰器,所以很容易 使用蓝图特定的自定义错误页面。

下面是 “404 Page Not Found” 异常的例子:

@simple_page.errorhandler(404)
def page_not_found(e):
    return render_template('pages/404.html')

大多数错误处理器会按预期工作。然而,有一个涉及 404 和 405 例外处理器的警示。 这些错误处理器只会由一个适当的 raise 语句引发或者调用在另一个蓝图视图 中调用 abort 引发。它们不会引发于无效的 URL 访问。这是因为蓝图不“拥有” 特定的 URL 空间,在发生无效 URL 访问时,应用实例无法知道应该运行哪个蓝图错 误处理器。 如果你想基于 URL 前缀执行不同的错误处理策略,那么可以 在应用层使用 request 代理对象定义它们:

@app.errorhandler(404)
@app.errorhandler(405)
def _handle_api_error(ex):
    if request.path.startswith('/api/'):
        return jsonify(error=str(ex)), ex.code
    else:
        return ex
posted @   我不知道取什么名字好  阅读(429)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示