144. Python语言 的 Flask框架项目前导 之 视图高级 第二章 :蓝图 和 子域名

乐正辰阳
2023-12-01

本章主题

  

关键词

  

蓝图

  之前我们写的 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

  ⽤ 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 上出现。

  

总结小便条

本篇文章主要讲了以下几点内容:

  

  本章回顾暂时就到这了,如果还有点晕,那就把文章里所有引用的案例代码再敲几遍吧。拜拜~

 类似资料: