蓝图
什么是蓝图?来看一下flask官方文档的定义:
Blueprint
是一种组织一组相关视图及其他代码的方式。与把视图及其他 代码直接注册到应用的方式不同,蓝图方式是把它们注册到蓝图,然后在工厂函数中 把蓝图注册到应用。
简单来说,就是为了优化代码结构和方便的管理视图函数,于是就有了蓝图这一个东西。话不多说,直接开始吧。
开始使用蓝图:
我们在这里使用的代码是我的上一篇文章中的代码,我们在这里继续使用。我们先来创建一个Python package
,然后命名为data,用来处理数据库的一些操作(求大佬不要说什么不规范,这一切都只是为了方便),结构如下:
然后我们在视图中写入函数,其实就是将上次APP里中的函数复制进来然后再创建一个蓝图:
from flask import Blueprint
data = Blueprint("data", __name__, url_prefix="/data")
解释一波:
这里创建了一个名称为 'data'
的 Blueprint
。和应用对象一样, 蓝图需要知道是在哪里定义的,因此把 __name__
作为函数的第二个参数。 url_prefix
会添加到所有与该蓝图关联的 URL 前面。
views的视图函数:
@data.route('/insert')
def add_user():
# user = User()
# name = "我将有{}个女朋友".format(random.randint(0, 50))
# user.uname = name
# db.session.add(user)
# db.session.commit()
return "<h1>add sucessful </h1>"
@data.route('/find')
def find_user():
# user = User.query.all()
# for u in user:
# print(u.uname)
return "ok"
因为我们只是需要能够访问就好,所以我把功能代码注释了
然后我们在app.py
中将这个蓝图注册进去:
app.register_blueprint(data)
然后我们启动服务器来试试看:
然后就成功了,突然发现我们如果直接使用“127.0.0.1:/find”的时候是404,这是为啥呢?然后想起这就是因为我们在蓝图创建的时候加入了url_prefix
这个属性,那么还记得它的解释吗?会给这个蓝图的所有URL都加上一个前缀,我们来试试:访问“127.0.0.1:/data/find”:
这样做有什么用呢?还麻烦,我当初也有这个迷茫。后面发现这个还是有用,在用户的时候有些的URL都是“http://www.yznx.com/user/**”这种的,这就是为了动态实现URL。同时当你在使用url_for()
函数的时候,你需要加上视图函数的端点是哪一个蓝图,就像是这样:
蓝图资源文件夹
和普通应用一样,蓝图一般都放在一个文件夹中。虽然多个蓝图可以共存于同一个文 件夹中,但是最好不要这样做。
文件夹由 Blueprint
的第二个参数指定,通常为 name 。这个参数 指定与蓝图相关的逻辑 Python 模块或包。如果这个参数指向的是实际的 Python 包 (文件系统中的一个文件夹),那么它就是资源文件夹。如果是一个模块,那么这个 模块包含的包就是资源文件夹。可以通过 Blueprint.root_path
属性来查 看蓝图的资源文件夹:
静态资源蓝图
静态资源包括模板和格式文件(css,js)我们先来看看模板吧。
模板:
在创建蓝图的时候你可以使用两个参数来指明蓝图使用的静态模板:
template_folder="../templates"
static_folder="../static"
然后注册蓝图:
app.register_blueprint(data)
然后这里注册的是你的蓝图名称,当你注册了后就可以使用了,每个蓝图就会来处理他对应的URL了。同时,如果你在使用url_for
来生成对应的URL的时候你就需要加上端点值:
url_for("data.find_user")
然后这个“data”是你在创建蓝图的时候第一个参数,然后后面是函数名。