蓝图
- 蓝图的作用就是让
Flask
项目更加模块化,结构更加清晰 - 为了更好的管理项目让项目达到分层解耦而产生的。
- 可以将相同模块的视图函数放在同一个蓝图下,同一个文件中,方便管理。
蓝图基本语法
- 在蓝图文件中导入
Blueprint
:
from flask import Blueprint
user_bp = Blueprint('user',__name__)
- 在主启动文件中注册蓝图:
from flask import Flask
from blueprints.user import user_bp
app = Flask(__name__)
app.register_blueprint(user_bp)
URL前缀
- 要某个蓝图下的所有url都有一个url前缀,那么可以在定义蓝图的时候,指定
url_prefix
参数。 - 在定义
url_prefix
的时候,要注意后面的斜杠,如果给了,那么以后在定义url与视图函数的时候,就不要再在url前面加斜杠了。
user_bp = Blueprint('user',__name__,url_prefix='/user')
#个人中心的 url与视图函数
@user_bp.route('/profile/')
def profile():
return '个人中心页面'
#个人设置中心的 url与视图函数
@user_bp.route('/settings/')
def settings():
return '个人设置页面'
蓝图中模版文件寻找规则
-
若templates目录下,有一个与蓝图文件指定的目录下同名的一个 html文件时,优先走templates目录下的文件
-
templates文件夹
如果项目中的templates文件夹中有相应的模版文件,就直接使用了。
news_bp = Blueprint('news',__name__,url_prefix='/news')
- 自动义文件夹
如果项目中的templates文件夹中没有相应的模版文件,那么就到在定义蓝图的时候指定的路径中寻找。并且蓝图中指定的路径可以为相对路径,相对的是当前这个蓝图文件所在的目录。
news_bp = Blueprint('news',__name__,url_prefix='/news',template_folder='news_page')
蓝图中静态文件寻找规则
- 正常情况下:在模版文件中,加载静态文件,如果使用
url_for('static')
,那么就只会在app指定的静态文件夹目录下查找静态文件。
<link rel="stylesheet"
href="{{ url_for('static',filename='news_list.css') }}">
- 自定义:如果在加载静态文件的时候,
url_for
指定的蓝图的名字,那么就会到这个蓝图指定的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') }}">
反转蓝图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>
- 如:同一个蓝图类/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 '新闻详情页面'
蓝图实现子域名
-
ip地址不能有子域名。
-
localhost也不能有子域名。
-
在创建蓝图对象的时候,需要传递一个
subdomain
参数,来指定这个子域名的前缀。
例如:cms_bp= Blueprint('cms',__name__,subdomain='test')
-
需要在主app文件中,需要配置
app.config
的SERVER_NAME
参数。
例如:app.config['SERVER_NAME']='wukong.com:5000'
-
在
C:\Windows\System32\drivers\etc
下,找到hosts
文件,然后添加域名与本机的映射。
域名和子域名都需要做映射。
例如:127.0.0.1 wukong.com; 127.0.0.1 test.wukong.com