1.蓝本
之前我们写的url和视图函数都是处在同一个文件,如果项目比较大的话,这显然不是一个合理的结构,而蓝图可以优雅的帮我们实现这种需求。
蓝本文件需要存储到一个python包中,然后再将蓝本从包中导入并注册进入Flask框架中来运行。python包不同于普通文件夹,其中含有一个__int__.py文件。
下面我们建立一个图书蓝本。首先,建立一个名为blueprint的python包,并新建一个book.py文件,book.py文件代码如下,
from flask import Blueprint, render_template # 导入相关库
book_bp = Blueprint('book', __name__, url_prefix='/book', template_folder='../book_templates')
# 实例化蓝图。第一个参数为蓝图名称(可自定义名称);第二个参数必填为__name__;url_prefix为路由前缀,我们这里设置为“/book”,index视图函数的路由地址就会变为“/book/”;template_folder为该蓝图指定的模板文件夹,当我们使用render_template()引用模板文件时,如果templates文件夹中没有找到模板,则会去该蓝图指定的模板文件夹中寻找模板文件
@book_bp.route('/')
def index():
return render_template('book_index.html')
因为,我们指定了蓝图的模板文件夹,因此我们需要创建模板文件夹book_templates,用来存储蓝图的相关模板,便于管理。在book_templates文件夹中创建book_index.html文件,代码如下,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图书首页</title>
</head>
<body>
<h3>图书首页</h3>
</body>
</html>
蓝本文件创建好之后,需要我们初始化蓝图,打开blueprint文件夹中的__init__.py文件,输入下列代码,
from .book import book_bp # 导入蓝图
最后打开app.py实例文件,注册蓝图,代码如下,
from flask import Flask
from blueprint import book_bp # 导入蓝图
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
app.register_blueprint(book_bp) # 注册蓝图
if __name__ == '__main__':
app.run(debug=True)
如果我们需要使用url_for()函数获取蓝图中的url地址,应使用url_for(‘蓝图名.视图函数名’)的形式。该蓝图名是我们实例化蓝图时填写的第一个参数。
2.子域名
子域名在许多网站中都用到了,比如一个网站叫做“xxx.com”,那么我们可以定义一个子域名“cms.xxx.com”来作为cms管理系统的网址,子域名的实现一般也是通过蓝图来实现,上个例子中,我们创建蓝图的时候添加了一个url_prefix=’/book’作为url前缀,那样我们就可以通过/book来访问book下的url。但使用子域名则不需要。另外,还需要配置SERVER_NAME,比如app.config[‘SERVER_NAME’]=‘book.com:9000’。并且在注册蓝图的时候,还需要添加一个subdomain的参数,这个参数就是子域名的名称,先来看一下蓝图的实现:
from flask import Blueprint, render_template
book_bp = Blueprint('book', __name__, template_folder='../book_templates', subdomain='book') # 添加subdomain参数
@book_bp.route('/')
def index():
return render_template('book_index.html')
app.py文件代码如下,
from flask import Flask
from blueprint import book_bp
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
app.config['SERVER_NAME'] = 'book.com:5000' # 配置SERVER_NAME
app.register_blueprint(book_bp)
if __name__ == '__main__':
app.run(debug=True)
写完以上两个文件后,还是不能正常的访问book.com:8000这个子域名,因为我们没有在host文件中添加域名解析。
host文件夹一般放在“C:\Windows\System32\drivers\etc”的位置,打开host文件并在最后添加一行127.0.0.1 book.com,就可以访问到了。另外,子域名不能在127.0.0.1上出现,也不能在localhost上出现。