之前我们写的 url 和视图函数都是处在同⼀个⽂件,如果项⽬⽐较⼤的话,这显然不是⼀个合理的结构,⽽蓝图可以优雅的帮我们实现这种需求。
from flask import Blueprint
bp = Blueprint('user',__name__,url_prefix='/user/')
@bp.route('/')
def index():
return "⽤户⾸⻚"
@bp.route('profile/')
def profile():
return "个⼈简介"
然后我们在主程序中,通过 app.register_blueprint()
⽅法将这个蓝图注册进 url 映射中,看下主 app
的实现:
from flask import Flask
import user
app = Flask(__name__)
app.register_blueprint(user.bp)
if __name__ == '__main__':
app.run(host='0.0.0.0',port=9000)
以后访问 /user/
, /user/profile/
,都是执⾏的 user.py
⽂件中的视图 函数,这样就实现了项⽬的模块化。
以上是对蓝图的⼀个简单介绍,但是使⽤蓝图还有⼏个需要注意的地⽅,就是 在蓝图如何寻找静态⽂件、模板⽂件, url_for
函数如何反转 url 。
默认不设置任何静态⽂件路径, Jinja2 会在项⽬的 static
⽂件夹中寻找静态⽂件。也可以设置其他的路径,在初始化蓝图的时候, Blueprint
这个构造 函数,有⼀个参数 static_folder
可以指定静态⽂件的路径:
bp = Blueprint('admin',__name__,url_prefix='/admin',static_folder= 'static')
static_folder
可以是相对路径(相对蓝图⽂件所在的⽬录),也可以是绝 对路径。在配置完蓝图后,还有⼀个需要注意的地⽅是如何在模板中引⽤静态 ⽂件。在模板中引⽤蓝图,应该要使⽤ 蓝图名+.+static
来引⽤:
<link href="{{ url_for('admin.static',filename='about.css') }}">
跟静态文件⼀样,默认不设置任何模板⽂件的路径,将会在项⽬的 templates
中寻找模板⽂件。也可以设置其他的路径,在构造函数 Blueprint
中有⼀个 template_folder
参数可以设置模板的路径:
bp = Blueprint('admin',__name__,url_prefix='/admin',template_folde r='templates')
模板文件 和 静态文件 有点区别,以上代码写完以后,如果你渲染⼀个模板 return render_template('admin.html')
, Flask 默认会去项目根目录下的 templates
文件夹中查找 admin.html
⽂件,如果找到了就直接返 回,如果没有找到,才会去蓝图⽂件所在的⽬录下的 templates
文件夹中寻找。
⽤ url_for
⽣成蓝图的 url ,使⽤的格式是: 蓝图名称+.+视图函数名称
。比如要获取 admin
这个蓝图下的 index
视图函数的 url :
url_for('admin.index')
其中这个蓝图名称是在创建蓝图的时候,传⼊的第⼀个参数。
bp = Blueprint('admin',__name__,url_prefix='/admin',template_folde r='templates')
子域名在许多⽹站中都⽤到了,⽐如⼀个⽹站叫做 xxx.com
,那么我们可以定 义⼀个⼦域名 cms.xxx.com
来作为 cms管理系统 的⽹址,⼦域名的实现⼀般也是通过蓝图来实现。
在之前章节中,我们创建蓝图的时候添加了⼀个 url_prefix=/user
作为 url前缀,那样我们就可以通过 /user/
来访问 user
下的 url,但 使⽤⼦域名则不需要。
另外,还需要配置 SERVER_NAME
,比如 app.config[SERVER_NAME]='example.com:9000'
。并且在注册蓝图的时候,还需要添加⼀个 subdomain
的参数,这个参数就是⼦域名的名称:
from flask import Blueprint
bp = Blueprint('admin',__name__,subdomain='admin')
@bp.route('/')
def admin():
return 'Admin Page'
这个没有多⼤区别,接下来看主 app
的实现:
from flask import Flask
import admin
# 配置`SERVER_NAME`
app.config['SERVER_NAME'] = 'example.com:8000'
# 注册蓝图,指定了subdomain
app.register_blueprint(admin.bp)
if __name__ == '__main__':
app.run(host='0.0.0.0',port=8000,debug=True)
写完以上两个文件后,还是不能正常的访问 admin.example.com:8000
这个⼦域名,因为我们没有在 host
⽂件中添加域名解析,你可以在最后添加⼀⾏ 127.0.0.1 admin.example.com
,就可以访问到了。另外,⼦域名不能 在 127.0.0.1
上出现,也不能在 localhost
上出现。
本篇文章主要讲了以下几点内容:
本章回顾暂时就到这了,如果还有点晕,那就把文章里所有引用的案例代码再敲几遍吧。拜拜~