Flask 学习笔记
一、蓝图基本应用
之前我们写的 url 和视图函数都是处在同一个文件,如果项目比较大需要映射的 html 页面很多的话,这显然不是一个合理的结构,而蓝图可以优雅的帮我们实现这种需求(把每个部分都分离开来,单独用一个 py 文件进行映射。
1.1、项目结构
1.2、蓝图使用
- 蓝图文件
from flask import Blueprint
# 使用 Blueprint(name, import_name) 初始化蓝图
# name 为蓝图的名字, import_name 为导入时使用的名字
book_bp = Blueprint("book", __name__)
print(__name__) # 打印返回 blueprints.books
@book_bp.route("/book/")
def bookview():
return "图书首页"
@book_bp.route("/book/<bid>/")
def book_detail(bid):
return "图书的ID:%s" % bid
- 执行文件
from flask import Flask
from blueprints.books import book_bp # 导入蓝图
app = Flask(__name__)
app.register_blueprint(book_bp) # 将这个蓝图注册进 url 映射中
@app.route("/")
def index():
return "首页"
if __name__ == '__main__':
app.run(debug=True)
- 可以在注册蓝图时通过设置
url_prefix
参数给定其 url 前缀
from flask import Blueprint
# url_prefix 表示当前文件中所有的路由前面都有 /book/
book_bp = Blueprint("book", __name__, url_prefix="/book/")
@book_bp.route("/") # url 为:/book/
def bookview():
return "图书首页"
@book_bp.route("/<bid>/") # url 为:/book/<bid>/
def book_detail(bid):
return "图书的ID:%s" % bid
1.3、寻找模板文件
默认不设置任何模板文件的路径,将会在项目的 templates 中寻找模板文件。也可以设置其他的路径,在构造函数 Blueprint 中有一个 template_folder
参数可以设置模板的路径。
news_bp = Blueprint("news", __name__, url_prefix="/news/", template_folder="blue_temp")
以上代码写完以后,如果你渲染一个模板 return render_template('news.html')
,Flask 默认会去项目根目录下的 templates 文件夹中查找 news.html 文件,如果找到了就直接返回,如果没有找到,才会去蓝图文件所在的目录下的 blue_temp
文件夹中寻找。
1.4、寻找静态文件
默认不设置任何静态文件路径,Jinja2 会在项目的 static 文件夹中寻找静态文件。也可以设置其他的路径,在初始化蓝图的时候,Blueprint 这个构造函数,有一个参数 static_folder
可以指定静态文件的路径。
news_bp = Blueprint("news", __name__, url_prefix="/news/", static_folder="static")
static_folder
可以是相对路径(相对蓝图文件所在的目录),也可以是绝对路径。在配置完蓝图后,还有一个需要注意的地方是如何在模板中引用静态文件。在模板中引用蓝图,应该要使用 蓝图名+.static
来引用。
<link href="{{ url_for('news.static', filename='news.css') }}">
1.5、url_for 生成 url
用 url_for 生成蓝图的 url,使用的格式是 蓝图名称.视图函数名称
。比如要获取 book 这个蓝图下的 book_detail
视图函数的 url
url_for("book.book_detail", bid=3)
其中这个蓝图名称是在创建蓝图的时候,传入的第一个参数。(前面也说过了)
book_bp = Blueprint("book", __name__, url_prefix="/book/")
二、子域名
子域名在许多网站中都用到了,比如一个网站叫做 xxx.com
,那么我们可以定义一个子域名 cms.xxx.com
来作为 cms 管理系统的网址,子域名的实现一般也是通过蓝图来实现,前面我们创建蓝图的时候添加了一个 url_prefix=/news/
作为 url 前缀,那样我们就可以访问 news下的 url。但子域名则有所不同,通过参数 subdomain
设置子域名的名称。
from flask import Blueprint, url_for
# subdomain 表示子域名
cms_bp = Blueprint("cms", __name__, subdomain="cms")
@cms_bp.route("/")
def cms():
return "cms 页面"
接下来是在执行文件中使用子域名
from flask import Flask, url_for
from blueprints.cms import cms_bp
app = Flask(__name__)
app.register_blueprint(cms_bp)
# 设置服务器的启动地址, 设置之后才可访问其子域名
# 但是 127.0.0.1 在这个 flask 项目就不能访问了
# crazy.com 这个域名也是自己设置的
app.config["SERVER_NAME"] = "crazy.com:5000"
@app.route("/")
def index():
print(url_for("cms.cms"))
return "首页"
if __name__ == '__main__':
app.run(debug=True)
写完以上两个文件后,还是不能正常的访问 cms.crazy.com:5000
这个子域名,因为我们没有在 C:\Windows\System32\drivers\etc\hosts
文件中添加域名解析,如下添加,就可以访问到了。另外,子域名不能在 127.0.0.1
上出现,也不能在 localhost
上出现。