成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

使用 Blueprint 要注意 render_template 函數(shù)

stonezhu / 2652人閱讀

摘要:此文章主要是為了記錄在使用的過程中遇到的問題。本章主要討論函數(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

相關(guān)文章

  • flask之三:視圖高級

    摘要:視圖高級和這個(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ù)...

    hot_pot_Leo 評論0 收藏0
  • flask之三:視圖高級

    摘要:視圖高級和這個(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ù)...

    RancherLabs 評論0 收藏0
  • flask之三:視圖高級

    摘要:視圖高級和這個(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ù)...

    xumenger 評論0 收藏0
  • Flask Web Development —— 大型應(yīng)用程序結(jié)構(gòu)(上)

    摘要:被定義在包的構(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...

    chemzqm 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<