第十阶段 -- Flask框架04:【Flask高级视图02:蓝图】

it2022-05-05  180

文章目录

1. 蓝图的基本使用2. 蓝图中模板文件寻找规则3. 蓝图中静态文件寻找规则4. url_for 翻转蓝图注意事项5. 子域名实现详解6. 示例

1. 蓝图的基本使用

定义:之前我们写的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前面加斜杠了。

2. 蓝图中模板文件寻找规则

蓝图模板文件的查找:

* 如果项目中的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目录下的东西。

3. 蓝图中静态文件寻找规则

* 在模版文件中,加载静态文件,如果使用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">

4. url_for 翻转蓝图注意事项

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 '新闻详情页面'

5. 子域名实现详解

* 蓝图实现子域名:(四个步骤)

使用蓝图技术。

在创建蓝图对象的时候,需要传递一个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也不能有子域名。

6. 示例

24_blueprint_demo.py from flask import Flask,url_for,render_template from blueprints.users import users_bp from blueprints.news import news_bp from blueprints.cms import cms_bp app = Flask(__name__) # 注册蓝图 app.register_blueprint(users_bp) app.register_blueprint(news_bp) app.register_blueprint(cms_bp) app.config['SERVER_NAME']="momo.com:5000" @app.route('/') def hello_world(): #url_for反转蓝图注意事项 构建/news/detail/ 场景1 print(url_for('news.detail')) #url_for('蓝图名称.视图函数名') # return 'Hello World!' return render_template('index.html') # 有n个模块 # 用户模块 # 读书模块 # 电影模块 # 新闻模块 if __name__ == '__main__': app.run(debug=True) news.py #新闻模块 crud from flask import Blueprint,render_template,url_for # news_bp = Blueprint('news',__name__,url_prefix='/news') #常规 news_bp = Blueprint('news',__name__,url_prefix='/news',template_folder='news_page',static_folder='news_static') #n个功能 #查询所有的新闻信息 @news_bp.route('/newslist/') def news_list(): # return "返回所有的新闻信息" #url_for反转蓝图注意事项 构建/news/detail/ 场景3 print(url_for('news.detail')) return render_template('news_list.html') #查询某新闻信息详情 @news_bp.route('/detail/') def detail(): return "新闻详情" users.py #用户模块 crud from flask import Blueprint,url_for users_bp= Blueprint('users',__name__,url_prefix='/user') #跟用户相关的功能 #查看用户信息 @users_bp.route('/profile/') def profile(): print(url_for('news.detail'),'用户') return "返回用户的详情" #设置用户信息 @users_bp.route('/settings/') def settings(): return "这是个人设置中心" cms.py(系统操作文件) from flask import Blueprint,render_template cms_bp = Blueprint('cms',__name__,subdomain='cms') #子域名的首页 @cms_bp.route('/') def hello(): return render_template('cms_index.html') @cms_bp.route('/ok/') def ok(): return "OK" index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h2>系统主页 </h2> <hr> <p>ko</p> <p>ko</p> <p>ok</p> <a href="http://cms.momo.com:5000/">学院</a> </body> </html> news_list.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> {# 常规写法【掌握】 #} {# <link type="text/css" rel="stylesheet" href="{{ url_for('static',filename='news_list.css') }}">#} {# 个性化写法【了解】 #} <link type="text/css" rel="stylesheet" href="{{ url_for('news.static',filename='news_list.css') }}"> </head> <body> <h3>这是渲染所有的新闻的页面1</h3> <hr> {# url_for反转蓝图注意事项 构建/news/detail/ 场景2#} <a href="{{ url_for('news.detail') }}">点击查看新闻详情</a> </body> </html> cms_index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h2>子域名首页</h2> <p>学院</p> </body> </html> news_list.css body{ color: red; font-size: 45px; }

最新回复(0)