学flask的第六天之蓝图 - 图1

蓝图

什么是蓝图?来看一下flask官方文档的定义:

Blueprint 是一种组织一组相关视图及其他代码的方式。与把视图及其他 代码直接注册到应用的方式不同,蓝图方式是把它们注册到蓝图,然后在工厂函数中 把蓝图注册到应用。

简单来说,就是为了优化代码结构和方便的管理视图函数,于是就有了蓝图这一个东西。话不多说,直接开始吧。

开始使用蓝图:

我们在这里使用的代码是我的上一篇文章中的代码,我们在这里继续使用。我们先来创建一个Python package,然后命名为data,用来处理数据库的一些操作(求大佬不要说什么不规范,这一切都只是为了方便),结构如下:
学flask的第六天之蓝图 - 图2
然后我们在视图中写入函数,其实就是将上次APP里中的函数复制进来然后再创建一个蓝图

  1. from flask import Blueprint
  2. data = Blueprint("data", __name__, url_prefix="/data")

解释一波:
这里创建了一个名称为 'data'Blueprint 。和应用对象一样, 蓝图需要知道是在哪里定义的,因此把 __name__作为函数的第二个参数。 url_prefix 会添加到所有与该蓝图关联的 URL 前面。
views的视图函数:

  1. @data.route('/insert')
  2. def add_user():
  3. # user = User()
  4. # name = "我将有{}个女朋友".format(random.randint(0, 50))
  5. # user.uname = name
  6. # db.session.add(user)
  7. # db.session.commit()
  8. return "<h1>add sucessful </h1>"
  9. @data.route('/find')
  10. def find_user():
  11. # user = User.query.all()
  12. # for u in user:
  13. # print(u.uname)
  14. return "ok"

因为我们只是需要能够访问就好,所以我把功能代码注释了

然后我们在app.py中将这个蓝图注册进去:

  1. app.register_blueprint(data)

然后我们启动服务器来试试看:
然后就成功了,突然发现我们如果直接使用“127.0.0.1:/find”的时候是404,这是为啥呢?然后想起这就是因为我们在蓝图创建的时候加入了url_prefix这个属性,那么还记得它的解释吗?会给这个蓝图的所有URL都加上一个前缀,我们来试试:访问“127.0.0.1:/data/find”:
学flask的第六天之蓝图 - 图3
这样做有什么用呢?还麻烦,我当初也有这个迷茫。后面发现这个还是有用,在用户的时候有些的URL都是“http://www.yznx.com/user/**”这种的,这就是为了动态实现URL。同时当你在使用url_for()函数的时候,你需要加上视图函数的端点是哪一个蓝图,就像是这样:
学flask的第六天之蓝图 - 图4

蓝图资源文件夹

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

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

静态资源蓝图

静态资源包括模板和格式文件(css,js)我们先来看看模板吧。
模板:
在创建蓝图的时候你可以使用两个参数来指明蓝图使用的静态模板:

  1. template_folder="../templates"
  2. static_folder="../static"

然后注册蓝图:

  1. app.register_blueprint(data)

然后这里注册的是你的蓝图名称,当你注册了后就可以使用了,每个蓝图就会来处理他对应的URL了。同时,如果你在使用url_for来生成对应的URL的时候你就需要加上端点值:

  1. url_for("data.find_user")

然后这个“data”是你在创建蓝图的时候第一个参数,然后后面是函数名。