摘要:此文章主要是為了記錄在使用的過程中遇到的問題。本章主要討論函數(shù)的問題。而對于不同里的,是依靠所注冊的藍(lán)圖以及不同的前綴來進(jìn)行區(qū)分。寫項(xiàng)目的時(shí)候,要注意此坑,函數(shù)里所調(diào)用的模板一定要保證命名在整個(gè)項(xiàng)目中的唯一性。
此文章主要是為了記錄在使用 Flask 的過程中遇到的問題。本章主要討論 render_template 函數(shù)的問題。
使用 Flask 的同學(xué)都應(yīng)該知道,項(xiàng)目中的 url 和視圖函數(shù)是在字典里一一對應(yīng)著的,再詳細(xì)一點(diǎn),就是 url 對應(yīng)著 endpoint,視圖函數(shù)也對應(yīng)著 endpoint,并且 endpoint 在字典里是唯一存在的。
而對于不同 Blueprint 里的 url,是依靠所注冊的藍(lán)圖以及不同的前綴來進(jìn)行區(qū)分。但是在視圖函數(shù)中所調(diào)用的 render_template 函數(shù)可得不到 endpoint 的支持,如果你使用的不同目錄下的一樣命名的模板文件,那么就會(huì)出現(xiàn)問題了。
先擺事實(shí)、再講道理。
明了問題所在實(shí)例項(xiàng)目的目錄結(jié)構(gòu)如下:
app ├── admin │?? ├── errors.py │?? ├── forms.py │?? ├── __init__.py │?? ├── static │?? │?? ├── css │?? ├── templates │?? │?? ├── index.html │?? ├── views.py ├── __init__.py ├── main │?? ├── errors.py │?? ├── forms.py │?? ├── __init__.py │?? ├── templates │?? │?? └── ousi │?? │?? ├── index.html │?? │?? ├── static │?? │?? │?? ├── css │?? ├── views.py ├── models.py
該項(xiàng)目中注冊兩個(gè) Blueprint,即 admin 是所謂的后臺管理藍(lán)圖,main 是所謂的前臺展示藍(lán)圖。
藍(lán)圖 admin 的 __init__.py 內(nèi)容如下:
# -*- coding:utf-8 -*- __author__ = "東方鶚" from flask import Blueprint admin = Blueprint("admin", __name__, template_folder="templates", static_folder="static") # 在末尾導(dǎo)入相關(guān)模塊,是為了避免循環(huán)導(dǎo)入依賴,因?yàn)樵谙旅娴哪K中還要導(dǎo)入藍(lán)本main from . import views, errors
藍(lán)圖 main 的 __init__.py 內(nèi)容如下:
# -*- coding:utf-8 -*- __author__ = "東方鶚" from flask import Blueprint main = Blueprint("main", __name__, template_folder="templates/ousi", static_folder="templates/ousi/static") # 在末尾導(dǎo)入相關(guān)模塊,是為了避免循環(huán)導(dǎo)入依賴,因?yàn)樵谙旅娴哪K中還要導(dǎo)入藍(lán)本main from . import views, errors
在定義兩個(gè)藍(lán)圖的時(shí)候,也對本藍(lán)圖所對應(yīng)的模板文件夾和靜態(tài)文件夾進(jìn)行了定義,此文主要關(guān)注模板文件夾。
那么,現(xiàn)在就說說出現(xiàn)了什么問題。
在各自藍(lán)圖的視圖函數(shù)中都對主頁 "/" 或叫做 "index" 進(jìn)行了定義。
其中,藍(lán)圖 admin 的視圖函數(shù)定義如下:
@admin.route("/", methods=["GET", "POST"]) @login_required def index(): return render_template("index.html")
請記住最后的代碼,即 render_template("index.html"),此處調(diào)用的模板名叫做 index.html。
藍(lán)圖 admin 的視圖函數(shù)定義如下:
@main.route("/", methods=["GET", "POST"]) def index(): return render_template("index.html")
請記住最后的代碼,即 render_template("index.html"),此處調(diào)用的模板名叫做 index.html。
到此,你發(fā)現(xiàn)了什么,你發(fā)現(xiàn)了什么,我估計(jì)你已經(jīng)看出來兩個(gè)視圖函數(shù)的最后一行代碼是一樣的,說得再精確點(diǎn),調(diào)用的模板名是一樣的。但是此處我們要保持清醒,雖然模板名稱一樣,但是所在目錄是不一樣的,它們所處的位置是各自所在的藍(lán)圖所定義的模板文件夾里。
說了這么多,到底怎么了呢。
這時(shí),如果你測試一下你的程序的話,你會(huì)發(fā)現(xiàn)兩個(gè)藍(lán)圖所顯示的內(nèi)容是一樣的,不管你相信不相信自己的眼睛,它就是一樣的界面,而且絕對一樣,因?yàn)?render_template("index.html") 調(diào)用的是同一個(gè)模板,它可不會(huì)區(qū)分藍(lán)圖。
那么,到底調(diào)用的是那個(gè)藍(lán)圖下的模板呢??繼續(xù)往下看。
這時(shí)你打開 app/__init__.py,內(nèi)容如下:
def create_app(config_name): """ 使用工廠函數(shù)初始化程序?qū)嵗?"" app = Flask(__name__) app.config.from_object(config[config_name]) config[config_name].init_app(app=app) # mail.init_app(app=app) moment.init_app(app=app) db.init_app(app=app) md.init_app(app=app) login_manager.init_app(app=app) # 注冊藍(lán)本 main from .main import main as main_blueprint app.register_blueprint(main_blueprint, url_prefix="/main") # 注冊藍(lán)本 admin from .admin import admin as admin_blueprint app.register_blueprint(admin_blueprint, url_prefix="/admin") # 注冊藍(lán)本 main #from .main import main as main_blueprint #app.register_blueprint(main_blueprint, url_prefix="/dynamic") return app
到底調(diào)用的是那個(gè)藍(lán)圖下的模板呢??
這個(gè),我可以明確告訴你,main 和 admin 兩個(gè)藍(lán)圖,哪個(gè)在 app/__init__.py 中先注冊,就調(diào)用那個(gè)藍(lán)圖的模板,也就是說哪個(gè)藍(lán)圖注冊時(shí)所用的代碼寫得靠上,就調(diào)用那個(gè)藍(lán)圖的模板。
這到底是為什么呢?為什么呢?這是 flask 項(xiàng)目的一個(gè)小 bug。寫項(xiàng)目的時(shí)候,要注意此坑,render_template() 函數(shù)里所調(diào)用的模板一定要保證命名在整個(gè)項(xiàng)目中的唯一性。
號外,號外今天又發(fā)現(xiàn)了一個(gè)坑,就是 jinja2 內(nèi)部的模板調(diào)用,比如 include 某某模板的時(shí)候,這個(gè)被調(diào)用的模板名稱也需要,而且強(qiáng)烈需要保證在整個(gè)項(xiàng)目,記住是整個(gè)項(xiàng)目中,其命名要具有唯一性。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/44506.html
摘要:視圖高級和這個(gè)方法是用來添加與視圖函數(shù)的映射。小例子如下請求上下文的定義,結(jié)合類視圖之前我們接觸的視圖都是函數(shù),所以一般簡稱視圖函數(shù)。 視圖高級 app.route和app.add_url_rule app.add_url_rule app.add_url_rule(/list/,endpoint=myweb,view_func=my_list) 這個(gè)方法是用來添加url與視圖函數(shù)...
摘要:視圖高級和這個(gè)方法是用來添加與視圖函數(shù)的映射。小例子如下請求上下文的定義,結(jié)合類視圖之前我們接觸的視圖都是函數(shù),所以一般簡稱視圖函數(shù)。 視圖高級 app.route和app.add_url_rule app.add_url_rule app.add_url_rule(/list/,endpoint=myweb,view_func=my_list) 這個(gè)方法是用來添加url與視圖函數(shù)...
摘要:視圖高級和這個(gè)方法是用來添加與視圖函數(shù)的映射。小例子如下請求上下文的定義,結(jié)合類視圖之前我們接觸的視圖都是函數(shù),所以一般簡稱視圖函數(shù)。 視圖高級 app.route和app.add_url_rule app.add_url_rule app.add_url_rule(/list/,endpoint=myweb,view_func=my_list) 這個(gè)方法是用來添加url與視圖函數(shù)...
摘要:被定義在包的構(gòu)造函數(shù)中的應(yīng)用程序工廠函數(shù)會(huì)在示例中展示。這個(gè)構(gòu)造函數(shù)導(dǎo)入大部分當(dāng)前需要使用的擴(kuò)展,但因?yàn)闆]有應(yīng)用程序?qū)嵗跏蓟鼈?,它可以被?chuàng)建但不初始化通過不傳遞參數(shù)給它們的構(gòu)造函數(shù)。而應(yīng)用程序范圍內(nèi)的錯(cuò)誤處理則必須使用。 雖然小型web應(yīng)用程序用單個(gè)腳本可以很方便,但這種方法卻不能很好地?cái)U(kuò)展。隨著應(yīng)用變得復(fù)雜,在單個(gè)大的源文件中處理會(huì)變得問題重重。 與大多數(shù)其他web框架不同,F(xiàn)l...
閱讀 1353·2021-11-23 09:51
閱讀 2732·2021-09-03 10:47
閱讀 2316·2019-08-30 15:53
閱讀 2523·2019-08-30 15:44
閱讀 1443·2019-08-30 15:44
閱讀 1276·2019-08-30 10:57
閱讀 2012·2019-08-29 12:25
閱讀 1155·2019-08-26 11:57