flask藍(lán)圖

藍(lán)圖的使用

  • 1.目錄結(jié)構(gòu):
目錄

app1: 單個應(yīng)用的目錄
app1/admin: app1下的一個功能模塊
app1/admin/templates: 存放實現(xiàn)admin功能的模板文件
app1/admin/urls.py: 類似Django的urls,設(shè)置路由(此處創(chuàng)建admin專屬的路由)
app1/admin/views.py: 模板渲染文件,類似Django的views
templates/index.html: 項目入口(或鏈接各個應(yīng)用)的模板文件
apps.py: 創(chuàng)建Flask-app對象;注冊藍(lán)圖,為藍(lán)圖添加前綴;啟動應(yīng)用

  • 2.文件內(nèi)容

1.app1/admin/templates/index.html


<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Admin</title>

</head>

<body>

    <h1>Admin</h1>

</body>

</html>

2.app1/admin/views.py

  • 渲染模板文件

from flask import render_template

def show_admin():

    return render_template('index.html')

3.app1/admin/urls.py

  • 注冊藍(lán)圖admin,指明模板文件,添加藍(lán)圖路由

from flask import Blueprint

from .views import *

admin = Blueprint('admin', __name__, template_folder='admin_templates')

admin.add_url_rule('/show_admin/', view_func=show_admin)

4.apps.py

  • 創(chuàng)建Flask-app對象;注冊藍(lán)圖,為藍(lán)圖添加前綴;啟動應(yīng)用

from flask import Flask

app1 = Flask(__name__)

from app1.admin.urls import admin

app1.register_blueprint(admin, url_prefix='/admin')

if __name__ == '__main__':

    app1.run(debug=True)

文件訪問

  • 通過藍(lán)圖注冊的靜態(tài)文件及模板文件的訪問規(guī)則如下:

1.如果在項目目錄下存在靜態(tài)文件和模板文件,則優(yōu)先訪問

首頁
  • manage_test/templates/index.html

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>首頁</title>

</head>

<body>

    <h1>首頁</h1>

</body>

</html>

  • app1/admin/templates/index.html

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Admin</title>

</head>

<body>

    <h1>Admin</h1>

</body>

</html>

  • app1/admin/urls.py 創(chuàng)建藍(lán)圖對象admin,在manage_test/app.py中注冊

from flask import Blueprint

from .views import *

admin = Blueprint('admin', __name__,

                static_folder='static',

                template_folder='templates')

admin.add_url_rule('/show_index/',

                  view_func=show_admin)

  • app1/admin/views.py 渲染網(wǎng)頁

from flask import render_template

def show_admin():

    return render_template('index.html')

  • manage_test/apps.py 創(chuàng)建app對象及注冊藍(lán)圖

from flask import Flask

app1 = Flask(__name__)

from app1.admin.urls import admin

app1.register_blueprint(admin, url_prefix='/admin')

if __name__ == '__main__':

    app1.run(debug=True)

  • 運(yùn)行apps.py,打開瀏覽器顯示結(jié)果如下

2.如果項目目錄下不存在靜態(tài)文件和模板文件,則優(yōu)先訪問最先注冊的藍(lán)圖目錄下的文件

  • 1.刪除manage_test/templates/index.html

    • 此時刷新網(wǎng)頁顯示結(jié)果如下:
  • 2.創(chuàng)建grade文件夾,里面也創(chuàng)建一個templates文件夾及index.html文件

    • app1/grade/views.py
    
    from flask import  render_template
    
    def show_index():
    
        return render_template('index.html')
    
    
    • urls.py
    
    from flask import Blueprint
    
    from .views import *
    
    grade = Blueprint('grade', __name__,
    
                    static_folder='static',
    
                    template_folder='templates')
    
    grade.add_url_rule('/show_index/',
    
                      view_func=show_index)
    
    
    • manage_test/apps.py 新增一個藍(lán)圖grade的注冊
    
    from flask import Flask
    
    app1 = Flask(__name__)
    
    from app1.admin.urls import admin
    
    from app1.grade.urls import grade
    
    app1.register_blueprint(grade, url_prefix='/grade')
    
    app1.register_blueprint(admin, url_prefix='/admin')
    
    if __name__ == '__main__':
    
        app1.run(debug=True)
    
    
    • 此時刷新網(wǎng)頁:

admin/show_index


grade/show_index


Tip:

  • 使用flask藍(lán)圖設(shè)置路由時需要注意靜態(tài)文件和模板文件不能同名

推薦做法一: 在每個功能模塊下的靜態(tài)和模板文件夾下再創(chuàng)建一個與應(yīng)用同名的文件夾

  • 修改admin/views.py return render_template('admin/index.html')

此時admin/show_index顯示:


推薦做法二: 每個模塊在創(chuàng)建文件夾時加上模塊名 admin_templates

(當(dāng)然如果是小組開發(fā),也可以使用代號LZ_templates)

推薦做法三: 根據(jù)模板文件的功能命名,確保不會與其他模塊重名

issue

  • ValueError: urls must start with a leading slash

藍(lán)圖在注冊添加前綴時沒有加'/'

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容