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