2

flask蓝图的简单介绍

蓝图概念的简单介绍:
Flask 用 蓝图(blueprints) 的概念来在一个应用中或跨应用制作应用组件和支持通的模式。蓝图很好地简化了大型应用工作的方式,并提供给 Flask 扩展在应用上注册操作的核心方法。一个 Blueprint 对象与 Flask 应用对象的工作方式很像,但它确实不是一个应用,而是一个描述如何构建或扩展应用的 蓝图 。

下面是我demo结构:
图片描述

为什么要使用蓝图?

  • 把一个应用分解为一个蓝图的集合。这对大型应用是理想的。一个项目可以实例化一个应用对象,初始化几个扩展,并注册一集合的蓝图。
  • 以 URL 前缀和/或子域名,在应用上注册一个蓝图。 URL 前缀/子域名中的参数即成为这个蓝图下的所有视图函数的共同的视图参数(默认情况下)。
  • 在一个应用中用不同的 URL 规则多次注册一个蓝图。
  • 通过蓝图提供模板过滤器、静态文件、模板和其它功能。一个蓝图不一定要实现应用或者视图函数。
  • 初始化一个 Flask 扩展时,在这些情况中注册一个蓝图。 引用自官方文档

在我看来,有了蓝图可以将一个应用注册成很多模块,方便管理,和添加扩展。

我的第一个蓝图

导入相应的模块,Blueprint中的三个参数,第一个可以自己随意命令,第二个一般都是__name__,
他指定了当前的flask应用,也就是当前我的app文件夹(也是一个包),第三个参数指定你存放,模板文
件的位置,这个主要看你你应用的目录结构,我喜欢只存放一个templates目录在app文件夹下,然后
使用相对路径。

    from flask import Blueprint, render_template, abort, redirect, url_for
    from jinja2 import TemplateNotFound

    blog = Blueprint('blog', __name__, template_folder='../templates')
    @blog.route('/index')
    def index():
        try:
            return render_template("blog.html")
            except TemplateNotFound:
            abort(404)
    @blog.route('/welcome')
    def welcome():
            return "welcome to blog"
        

当时这样你并不能访问网页,因为你还没有注册蓝图,蓝图不是即插即用的

注册蓝图

在注册前一定要导入相应的蓝图,如代码中的admin和blog。

    from flask import Flask
    from view.addmin import admin
    from view.blog import blog
    app = Flask(__name__)
    app.register_blueprint(blog, url_prefix='/blog')
    app.register_blueprint(admin, url_prefix='/admin')

    if __name__ == "__main__":
        app.run(debug=True)
        # from werkzeug.serving import run_simple
        # run_simple('localhost', 5000, app)

访问相应的页面时,一定要将url_prefix中的前缀加上,比如要访问blog.html中的内容,要写成http://localhost/blog/index 的形式。

构造URL

要想从一个页面跳转到另一个页面,通常是redirect和url_for配合使用,由于我们加入了蓝图,在访问时
我们可以更加轻松

    url_for('blog.index')

具体代码如下:

    from flask import Blueprint, render_template, abort, redirect, url_for
    from jinja2 import TemplateNotFoun

    blog = Blueprint('blog', __name__, template_folder='../templates')
    @blog.route('/index')
    def index():
        try:
            return redirect(url_for('blog.welcome'))
        except TemplateNotFound:
            abort(404)
    @blog.route('/welcome')
    def welcome():
        return "welcome to blog"
        

当你访问/blog/index的页面时,会自动帮你跳转到/blog/welcome的页面中。

以上大部分内容都借鉴自官方文档,如果有不明白的地方,可以自行查阅。


Micon
12 声望7 粉丝

enjoy simplicity