天天看點

Python全棧 Web(Flask架構、變量、模闆)

模闆 Templates:

模闆中的文法規範

變量:

變量時一種特殊的占位符   告訴模闆引擎該位置的

值是從渲染模闆時的資料中來擷取的

在視圖中:

@app.route("/temp")
def temp():
    return render_template("01_temp.html",uname="user name")           

name和age就是要傳遞到xxx.html中的變量

在模闆中:

{{變量名}}

<title>{{unam}}</title>           

Python代碼

@app.route("/temp")
def temp():
    dic = {"bookName":"鋼鐵是咋煉成的",
           "author": "魯迅",
           "price": 32.5 ,
           "publisher": "北京大學出版社"}

    # 字典傳參  模闆中直接用變量名  不需要params.xxx
    return render_template("01_temp.html", **dic)
    return render_template("01_temp.html", params=dic)


    # 第二種傳參方式
    bookName = "鋼鐵是咋煉成的"
    author = "魯迅"
    price = 32.5
    publisher = "北京大學出版社"
    return render_template("01_temp.html", **locals())
    return render_template("01_temp.html", params=locals())

           

模闆

<div>
        <h1><<{{bookName}}>></h1>
        <h3>作者:{{author}}</h3>
        <h3>價格:{{price}}</h3>
        <h3>出版社:{{publisher}}</h3>
    </div>
    <div>
        <h1><<{{params.bookName}}>></h1>
        <h3>作者:{{params.author}}</h3>
        <h3>價格:{{params.price}}</h3>
        <h3>出版社:{{params.publisher}}</h3>           

變量可以傳遞任何類型參數 包括示例對象

tup = ("劉德華", "郭富城", "黎明")

    list = ["胡歌", "神話", "仙劍"]


    class Person(object):

        def __init__(self):
            self.name = "None"

        def say(self):
            return "類方法"


    per = Person()
    return render_template("01_temp.html", params=locals())           

過濾器:

什麼是過濾器?

過濾是允許在變量輸出顯示之前改變變量的值

文法:

{{變量|過濾器}}

Jinja2 變量過濾器

capitalize:

首字母大寫 其他小寫

lower:

把值轉換成全小寫

upper:

把值轉換成全大寫

title:

把值中的每個單首字母全大寫

trim:

去掉兩端空格

<h3>原始值:{{params.uname}}</h3>
        <h3>capitalize:{{params.uname|capitalize}}</h3>
        <h3>upper:{{params.uname|upper}}</h3>
        <h3>lower:{{params.uname|lower}}</h3>
        <h3>title:{{params.uname|title}}</h3>           

控制結構:

if結構:

{% if 條件 %}

要執行的代碼

{% endif %}

if-else:

瞞住條件要執行的代碼

{% else %}

不滿足執行

if-elif-else:

{% elif 條件 %}

if結構:
        {% if params.list %}
            <h1>{{params.list}}</h1>
        {% endif %}

        <p>
            if-else:
            {% if params.uname %}
                <h1>params.uname</h1>
            {% else %}
                <h1><a href="{{url_for('login')}}">登入</a></h1>
            {% endif %}
           

for結構:

{% for 變量 in 元組/字典/清單 %}

周遊内容

{% endfor %}

for循環:
            <div style="font-size: 22px;">
                {% for str in params.list %}
                    <p>{{str}}</p>
                {% endfor %}
            </div>

            <ul>
                {% for str in params.tup %}
                    <li>{{str}}</li>
                {% endfor %}
            </ul>

            <div style="color: red;">
                {% for key, value in params.dic.items() %}
                    <h2>{{key}}:{{value}}</h2>
                {% endfor %}           

宏:

使用{% macro %}标簽  聲明宏

宏:
            <p>
                <!--聲明-->
                {% macro show(str) %}
                    <li style="background-color: aqua;">{{str}}</li>
                {% endmacro %}
            </p>

            <!--使用宏顯示資料-->
            <p>
                {% for str in params.list %}
                    {{show(str)}}
                {% endfor %}
            </p>           

為了友善重複使用 允許将宏放在單獨的模闆檔案宏單獨聲明定義

建立  macro.html 

檔案内可以寫很多個宏  類似于函數子產品

使用時導入 macro.html

{% import "macro.html" as macros %}

調用:

{{macro.show()}}

模闆的包含:

在多處重複使用的模闆代碼可以放在單獨的檔案中 可以被其他的模闆所包含(引用)

{% include "xxx.html" %}

Python全棧 Web(Flask架構、變量、模闆)

靜态檔案:

什麼是靜态檔案?

在Flask中不能與伺服器動态互動的檔案都是靜态檔案

如:css,js,圖檔,音視訊,壓縮檔案。。。。

并且不能使用實體路徑進行查找

靜态檔案處理:

所有的靜态檔案都儲存在 項目檔案中的一個 static 檔案夾中

static檔案内可以建立子檔案夾

在通路靜态檔案時需要通過/static/資源路徑 進行通路

相當于将邏輯路徑的控制權交給實體路徑  

後面就可以寫實體路徑進行查找檔案了

靜态檔案反向解析:

url_for("static", filename="<file_path>")
		<img src="{{ url_for('static', filename=) }}"           

模闆的繼承:

什麼是模闆的繼承?

模闆的繼承類似于類的繼承 如果一個模闆中出現大量模闆的話

那麼就可以使用繼承的方式來簡化開發

繼承的文法:

父模闆中

需要定義哪些内容在子模闆中是可以被重寫的

{% block 塊名 %}

{% endblock %}

block:

應以允許定義在子模闆中被修改的内容

       在父模闆中正常顯示 沒有影響

           在子模闆中可以被重寫

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>這是父模闆中  頭部</h1>
    {% block container %}
    <h1>這是父模闆中  住部</h1>
    {% endblock %}
    <h1>這是父模闆中  地部</h1>
</body>
</html>           

子模闆中

使用{% extends "父模闆名稱" %} 來完成繼承

使用{% block 塊名 %} 來重寫父模闆中的同名内容

{% extends "04_parent.html" %}

{% block container %}
    {{ super() }}
    <h1>子标簽</h1>
{% endblock %}
           

自定義錯誤頁面

404錯誤處理

@app.errorhandler(404)

def page_not_found(e):

return render_template("404.html"), 404

@app.errorhandler(404)
def Error_404():
    return render_template("404.html")
           

500錯誤處理

@app.errorhandler(500)

def internal_server_error(e):

return render_template("505.html"), 505

@app.errorhandler(505)
def Error_404():
    return render_template("505.html")           

繼承後可以無是以為的修改網頁内容  想怎麼該怎麼改

Python全棧 Web(Flask架構、變量、模闆)