蓝图和子域名

Flask 学习笔记

一、蓝图基本应用


        之前我们写的 url 和视图函数都是处在同一个文件,如果项目比较大需要映射的 html 页面很多的话,这显然不是一个合理的结构,而蓝图可以优雅的帮我们实现这种需求(把每个部分都分离开来,单独用一个 py 文件进行映射。


1.1、项目结构

在这里插入图片描述


1.2、蓝图使用

  1. 蓝图文件
	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
  1. 执行文件
	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)
  1. 可以在注册蓝图时通过设置 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 上出现。

在这里插入图片描述

发布了145 篇原创文章 · 获赞 1 · 访问量 5848

猜你喜欢

转载自blog.csdn.net/qq_43621629/article/details/105625003
今日推荐