定义:之前我们写的url和视图函数都是处在同一个文件,如果项目比较大的话,这显然不是一个合理的结构,而蓝图可以优雅的帮我们实现这种需求。
蓝图的作用就是让我们的Flask项目更加模块化,结构更加清晰,为了更好的管理项目 让项目达到分层解耦 而产生的。可以将相同模块的视图函数放在同一个蓝图下,同一个文件中,方便管理。
语法:
在蓝图文件中导入Blueprint: from flask import Blueprint user_bp = Blueprint('user',__name__) 在主app文件中注册蓝图: from flask import Flask from blueprints.user import user_bp app = Flask(__name__) app.register_blueprint(user_bp) 如果想要某个蓝图下的所有url都有一个url前缀,那么可以在定义蓝图的时候,指定url_prefix参数: user_bp = Blueprint('user',__name__,url_prefix='/user') # 个人中心的 url与视图函数 @user_bp.route('/profile/') def profile(): return '个人中心页面' # 个人设置中心的 url与视图函数 @user_bp.route('/settings/') def settings(): return '个人设置页面' 注意:在定义 url_prefix 的时候,要注意后面的斜杠,如果给了,那么以后在定义url与视图函数的时候,就不要再在url前面加斜杠了。蓝图模板文件的查找:
* 如果项目中的templates文件夹中有相应的模版文件,就直接使用了。
* 如果项目中的templates文件夹中没有相应的模版文件,那么就到在定义蓝图的时候指定的路径中寻找。并且蓝图中指定的路径可以为相对路径,相对的是当前这个蓝图文件所在的目录。比如:
news_bp = Blueprint('news',__name__,url_prefix='/news',template_folder='news_page') 项目的截图为:因为这个蓝图文件是在blueprints/news.py,那么就会到blueprints这个文件夹下的news_page文件夹中寻找模版文件。
小总结: 常规:蓝图文件在查找模版文件时,会以templates为根目录进行查找 news_bp = Blueprint('news',__name__,url_prefix='/news') 注意01:个性化coder喜欢在【创建蓝图对象的时候】指定 模版文件的查找路径 如下: news_bp = Blueprint('news',__name__,url_prefix='/news',template_folder='news_page') 注意02:只有确定templates目录下没有对应的 html文件名的时候,才会去蓝图文件指定的目录下查找,指定才会生效。注意03:若templates目录下,有一个与蓝图文件指定的目录下同名的一个 html文件时,优先走templates目录下的东西。* 在模版文件中,加载静态文件,如果使用url_for(‘static’),那么就只会在app指定的静态文件夹目录下查找 静态文件。如:
<link rel="stylesheet" href="{{ url_for('static',filename='news_list.css') }}"> 寻找结果:* 如果在加载静态文件的时候,指定的蓝图的名字,比如news.static,那么就会到这个蓝图指定的static_folder下查找静态文件。如:
from flask import Blueprint,render_template,url_for news_bp = Blueprint('news',__name__,url_prefix='/news',template_folder='news_page',static_folder='news_page_static') <link rel="stylesheet" href="{{ url_for('news.static',filename='news_list.css') }}"> 寻找结果:* 小总结:
蓝图文件查找方式1【掌握】:查找静态文件时,正常情况下,会以static为根目录进行查找
<url_for('static',filename='news_list.css') }}" rel="stylesheet" type="text/css">蓝图文件查找方式2【了解】:查找静态文件时,非正常情况下,需要用url_for(‘蓝图的名字.static’),
然后会去蓝图对象在创建时指定的静态文件夹目录下 去查找静态文件
news_bp = Blueprint('news',__name__,url_prefix='/news',template_folder='news_page',static_folder='news_statics') <link href="{{ url_for('news.static',filename='news_list.css') }}" rel="stylesheet" type="text/css">url_for反转蓝图中的视图函数为url:
如果使用蓝图,那么以后想要反转蓝图中的视图函数为url,那么就应该在使用url_for的时候指定这个蓝图名字。 app类中、模版中、同一个蓝图类中都是如此。否则就找不到这个endpoint。
* 如app类blueprint_demo.py中:
# 如下写法:才找得到 url_for('蓝图名称.方法名') print(url_for('news.news_list'))#/news/list/* 如模版/templates/index.html中:
<a href="{{ url_for('news.news_list')}}">新闻列表 OK写法</a> {# <a href="{{ url_for('news_list')}}">新闻列表 no Ok写法</a>#}*如同一个蓝图类/blueprints/news.py中:
from flask import Blueprint,render_template,url_for news_bp = Blueprint('news',__name__,url_prefix='/news',template_folder='news_page',static_folder='news_page_static') @news_bp.route('/list/') def news_list(): print(url_for('news.news_detail')) #/news/detail/ return render_template('news_list.html') @news_bp.route('/detail/') def news_detail(): return '新闻详情页面'* 蓝图实现子域名:(四个步骤)
使用蓝图技术。
在创建蓝图对象的时候,需要传递一个subdomain参数,来指定这个子域名的前缀。 例如: cms_bp= Blueprint('cms', __name__, subdomain='cms')
需要在主app文件中,需要配置app.config的SERVER_NAME参数。例如: app.config['SERVER_NAME']='momo.com:5000'
在C:\Windows\System32\drivers\etc下,找到hosts文件,然后添加域名与本机的映射。 域名和子域名都需要做映射。例如:
127.0.0.1 momo.com
127.0.0.1 cms.momo.com
注意:
* ip地址不能有子域名。
* localhost也不能有子域名。