国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

使用 Blueprint 要注意 render_template 函數

stonezhu / 2602人閱讀

摘要:此文章主要是為了記錄在使用的過程中遇到的問題。本章主要討論函數的問題。而對于不同里的,是依靠所注冊的藍圖以及不同的前綴來進行區(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

相關文章

  • flask之三:視圖高級

    摘要:視圖高級和這個方法是用來添加與視圖函數的映射。小例子如下請求上下文的定義,結合類視圖之前我們接觸的視圖都是函數,所以一般簡稱視圖函數。 視圖高級 app.route和app.add_url_rule app.add_url_rule app.add_url_rule(/list/,endpoint=myweb,view_func=my_list) 這個方法是用來添加url與視圖函數...

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

    摘要:視圖高級和這個方法是用來添加與視圖函數的映射。小例子如下請求上下文的定義,結合類視圖之前我們接觸的視圖都是函數,所以一般簡稱視圖函數。 視圖高級 app.route和app.add_url_rule app.add_url_rule app.add_url_rule(/list/,endpoint=myweb,view_func=my_list) 這個方法是用來添加url與視圖函數...

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

    摘要:視圖高級和這個方法是用來添加與視圖函數的映射。小例子如下請求上下文的定義,結合類視圖之前我們接觸的視圖都是函數,所以一般簡稱視圖函數。 視圖高級 app.route和app.add_url_rule app.add_url_rule app.add_url_rule(/list/,endpoint=myweb,view_func=my_list) 這個方法是用來添加url與視圖函數...

    xumenger 評論0 收藏0
  • Flask Web Development —— 大型應用程序結構(上)

    摘要:被定義在包的構造函數中的應用程序工廠函數會在示例中展示。這個構造函數導入大部分當前需要使用的擴展,但因為沒有應用程序實例初始化它們,它可以被創(chuàng)建但不初始化通過不傳遞參數給它們的構造函數。而應用程序范圍內的錯誤處理則必須使用。 雖然小型web應用程序用單個腳本可以很方便,但這種方法卻不能很好地擴展。隨著應用變得復雜,在單個大的源文件中處理會變得問題重重。 與大多數其他web框架不同,Fl...

    chemzqm 評論0 收藏0

發(fā)表評論

0條評論

stonezhu

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<