Day045 蓝图的基本使用

mac2025-08-09  18

蓝图:

之前我们写的url和视图函数都是处在同一个文件,如果项目比较大的话,这显然不是一个合理的结构,而蓝图可以优雅的帮我们实现这种需求。

1. 蓝图的作用就是让我们的Flask项目更加模块化,结构更加清晰,为了更好的管理项目 让项目达到分层解耦 而产生的。可以将相同模块的视图函数放在同一个蓝图下,同一个文件中,方便管理。

2. 基本语法:

* 在蓝图文件中导入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)

3. 如果想要某个蓝图下的所有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前面加斜杠了。

4. 蓝图模版文件的查找:

* 如果项目中的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')

注意1:个性化coder 喜欢在【创建蓝图对象的时候】 指定 模版文件的查找路径 如下:

news_bp = Blueprint('news',__name__,url_prefix='/news',template_folder='news_page')

注意2:只有确定templates目录下没有对应的 html文件名的时候,才会去蓝图文件指定的目录下查找,指定才会生效

注意3:若templates目录下,有一个与蓝图文件指定的目录下同名的一个 html文件时,优先走templates目录下的东西

5. 蓝图中静态文件的查找规则:

* 在模版文件中,加载静态文件,如果使用url_for('static'),那么就只会在app指定的静态文件夹目录下查找 静态文件。如:

html:

<link rel="stylesheet" href="{{ url_for('static',filename='news_list.css') }}">

寻找结果如图:

* 如果在加载静态文件的时候,指定的蓝图的名字,比如`news.static`,那么就会到这个蓝图指定的static_folder下查找静态文件。如:

python:

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')

html:

<link rel="stylesheet" href="{{ url_for('news.static',filename='news_list.css') }}">

寻找结果如图:

小总结:

蓝图文件查找方式1【掌握】:查找静态文件时,正常情况下,会以static为根目录进行查找

<link href="{{ 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">

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

7. 蓝图实现子域名:

1. 使用蓝图技术。

2. 在创建蓝图对象的时候,需要传递一个`subdomain`参数,来指定这个子域名的前缀。

例如:cms_bp= Blueprint('cms',__name__,subdomain='cms')

3. 需要在主app文件中,需要配置app.config的SERVER_NAME参数。例如:

app.config['SERVER_NAME']='momo.com:5000'

4. 在`C:\Windows\System32\drivers\etc`下,找到hosts文件,然后添加域名与本机的映射。 域名和子域名都需要做映射。例如:

127.0.0.1 momo.com

127.0.0.1 cms.momo.com

注意:

* ip地址不能有子域名。

* localhost也不能有子域名。

最新回复(0)