主頁 > 後端開發 > Flask-模板

Flask-模板

2020-10-05 00:11:29 後端開發

一、cookie

  • 解釋: 用來保持服務器和瀏覽器互動的狀態的, 由服務器設定,存盤在瀏覽器
  • 作用: 用來做廣告推送
  • cookie的設定和獲取
    • 設定cookie: response.set_cookie(key,value,max_age)
      • max_age: 表示cookie在瀏覽器的存盤時間,單位是秒
    • 獲取cookie: request.cookies.get("key")
from flask import Flask, make_response, request

app = Flask(__name__)

#設定cookie
@app.route('/set_cookie')
def set_cookie():

    #呼叫make_response方法獲取回應體物件
    response = make_response("set cookie")

    #設定cookie
    response.set_cookie("computer","lenovo")
    response.set_cookie("age","13",10)

    return response


#獲取cookie
@app.route('/get_cookie')
def get_cookie():

    #獲取cookie
    name = request.cookies.get("computer")
    age = request.cookies.get("age")

    #回傳
    return "name is %s, age is %s"%(name,age)

if __name__ == '__main__':
    app.run(debug=True)

二、session

  • 解釋: 服務器和用戶來做狀態保持的,里面存盤的是敏感資訊(比如身份證,登陸資訊),由服務器設定,并存盤在服務器
  • 作用: 用來做用戶的登陸狀態保持
  • session的設定和獲取
    • 設定session: sessioin[key] = value
    • 獲取session: value = https://www.cnblogs.com/mengd/archive/2020/10/04/session.get(key)
  • 注意點:
    • 1.session的存盤依賴于cookie
    • 2.存盤在cookie中的sessionID需要加密,需要秘鑰(SECRET_KEY)
from flask import Flask, session

app = Flask(__name__)

#設定SECRET_KEY,此時就是隨意的字串
app.config["SECRET_KEY"] = "sdofinsidofnsfdas"

#設定session
@app.route('/set_session/<path:name>')
def set_session(name):

    session["name"] = name

    return "set session!"


#獲取session
@app.route('/get_session')
def get_session():

    value = https://www.cnblogs.com/mengd/archive/2020/10/04/session.get("name")

    return "set session, name is %s"%value


if __name__ == '__main__':
    app.run(debug=True)

三、背景關系

  • 解釋: 就是一個容器
  • 請求背景關系
    • request: 封裝的是請求相關的資料
    • session: 封裝的是和用戶相關的敏感資訊
  • 應用背景關系(在專案中具體應用)
    • current_app: 是app的一個代理物件,可以通過他獲取app身上設定的各種屬性,主要用在模塊化開發中
    • g: 一個區域的全域變數,主要用在裝飾器中
from flask import Flask, current_app

app = Flask(__name__)

@app.route('/')
def hello_world():

    print(app.config.get("DEBUG"))
    print(current_app.config.get("DEBUG"))

    return "helloworld"

if __name__ == '__main__':
    app.run(debug=True)

四、Flask_script

  • 解釋: 屬于flaks的擴展
  • 作用: 用來動態運行程式,配合flask_migrate做資料庫遷移
  • 使用格式:
    • 1.安裝
      • pip install flask_script
    • 2.匯入Manager類
    • 3.創建物件manager,管理app
    • 4.使用manager啟動程式
      • 啟動命令: python xxx.py runserver -h(host是IP地址) -p(埠號) -d(除錯模式)
from flask import Flask
from flask_script import Manager

app = Flask(__name__)
app.config["DEBUG"] = True

#3.創建物件manager,管理app
manager = Manager(app)

@app.route('/')
def hello_world():

    return "helloworld"

if __name__ == '__main__':
    manager.run()

五、render_template

  • 解釋: 屬于jinja2的模板函式
  • 好處:
    • 1.以后的視圖函式,只負責業務邏輯的處理,比如: 資料庫的增刪改查
    • 2.以后資料的展示,全部都有jinja2的模板負責
  • 使用格式:
    • response = render_template('模板檔案',key=value)

模板檔案寫在自動生成的templates目錄下

如果是自己建的目錄需要這樣

from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def hello_world():

    response = render_template('template.html')

    return response

if __name__ == '__main__':
    app.run(debug=True)

template.html檔案

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .box{
            width: 300px;
            height: 300px;
            background: red;
        }

    </style>
</head>
<body>

    <div >

    </div>

</body>
</html>

六、模板語法,獲取變數

  • 解釋: 在模板中獲取視圖函式的變數
  • 格式:
    • {{ 變數 }}
from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def hello_world():

    #1.定義各種型別的變數
    number = 10
    str = "老王"
    tuple = (1,2,3,4,5)
    list = [6,7,8,9,10]
    dict = {
        "name":"班長",
        "age":29
    }

    #2.攜帶變數到模板中展示
    return render_template("variable.html",number=number,str=str,tuple=tuple,list=list,dict=dict)

if __name__ == '__main__':
    app.run(debug=True)

variable.html檔案

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <h1>1.獲取各種變數的值</h1>
    <h2>整數: {{number}}</h2>
    <h2>字串: {{str}}</h2>
    <h2>元祖: {{tuple}},分開獲取: {{tuple[0]}}, {{ tuple.1 }}</h2>
    <h2>串列: {{list}},分開獲取: {{ list.0 }}, {{ list.1 }}</h2>
    {# 如果字典使用方括號,獲取,需要寫成字串,如果不是字串,那么則會被當成變數對待   #}
    <h2>字典: {{dict}}, 分開獲取: {{ dict.name }}, {{ dict["age"] }}</h2>

</body>
</html>

七、模板語法,分支回圈判斷

  • 模板語法的種類

    • 分支格式:

      {% if 條件 %}
      	陳述句1
      {% else%}
      	陳述句2
      {% endif %}
      
    • 回圈陳述句格式:

      {% for 變數 in 容器 %}
      
      {% endfor %}
      
    • 注釋:

      {# 這里是注釋的內容 #}
      
from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def hello_world():

    #1.定義各種型別的變數
    number = 10
    str = "老王"
    tuple = (1,2,3,4,5)
    list = [6,7,8,9,10]
    dict = {
        "name":"班長",
        "age":29
    }

    #2.攜帶變數到模板中展示
    return render_template("programer.html",number=number,str=str,tuple=tuple,list=list,dict=dict)

if __name__ == '__main__':
    app.run(debug=True)

對應的html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        h1{
            color:red;
        }

    </style>
</head>
<body>

    <h1>1.遍歷元祖中的偶數</h1>
    {% for item in tuple %}
        {% if item %2 == 0 %}
            <h3>{{ item }}</h3>
        {% endif %}
    {% endfor %}


    <h1>2.遍歷字典</h1>
    {% for key in dict %}
        {# dict.key那么這個key會當成字典中的一個鍵,  dict[key],那么這個key當成一個變數 #}
        <h3>{{ key }} = {{ dict[key] }}</h3>
    {% endfor %}


</body>
</html>

八、系統字串過濾器

  • 解釋: 過濾器,用來過濾想要的資料
  • 格式: {{ 字串 | 字串過濾器 }}
  • 常見的字串過濾器有:
    • title: 將每個單詞的首字母都大寫
    • lower: 將每個單詞都小寫
    • upper: 將每個單詞都大寫
    • reverse: 反轉
    • ....
from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def hello_world():

    return render_template("stringfilter.html")

if __name__ == '__main__':
    app.run(debug=True)

對應的html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    {#    使用格式:{{ 字串 | 字串過濾器 }}#}
    1.safe:禁用轉義,讓標簽生效
    <p>{{ '<em>hello</em>' | safe }}</p>

    2.capitalize:把變數值的首字母轉成大寫,其余字母轉小寫
    <p>{{ 'hello PYTHON' | capitalize }}</p>

    3.lower:把值轉成小寫
    <p>{{ 'HELLO PYthON' | lower }}</p>

    4.upper:把值轉成大寫,中文沒有大小寫
    <p>{{ 'hello python 你好' | upper }}</p>

    5.title:把值中的每個單詞的首字母都轉成大寫
    <p>{{ 'hello world python java' | title }}</p>

    6.reverse:字串反轉
    <p>{{ 'olleh' | reverse }}</p>
    <p>{{ '我愛你' | reverse }}</p>


    7.format:格式化輸出
    <p>{{ '%s is %d' | format('age',17) }}</p>

    8.striptags:渲染之前把值中所有的HTML標簽都刪掉
    <p>{{ '<em>hello</em>' | striptags }}</p>

</body>
</html>

九、系統串列過濾器

  • 解釋: 過濾器,用來過濾想要的資料
  • 格式: {{ 串列 | 串列過濾器 }}
  • 常見的串列過濾器有:
    • first: 獲取串列第一個元素
    • last: 最后一個元素
    • sum: 串列和
    • length: 串列長度
    • ....
from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def hello_world():

    return render_template("list_fliter.html")

if __name__ == '__main__':
    app.run(debug=True)

對應的html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {#    * 使用格式:{{ 串列 | 串列過濾器 }}#}

    1.first:取第一個元素
    <p>{{ [1,2,3,4,5,6] | first }}</p>

    2. last:取最后一個元素
    <p>{{ [1,2,3,4,5,6] | last }}</p>

    3. length:獲取串列長度
    <p>{{ [1,2,3,4,5,6] | length }}</p>

    4.sum:串列求和
    <p>{{ [1,2,3] | sum }}</p>

    5.sort:串列排序,默認升序
    <p>{{ [6,2,3,1,5,4] | sort }}</p>


    6.過濾器的鏈式呼叫
    {# 過濾器的鏈式呼叫 #}
    {{ "hello" | upper | reverse }}

</body>
</html>

十、自定義過濾器

  • 解釋: 當系統提供的過濾器滿足不了需求的時候,需要自定義

  • 自定義過濾器有兩種格式:

    • 1.先定義好函式,再將函式添加到系統默認的過濾器串列中

      • def 函式名: pass
      • app.add_template_filter(函式名,'過濾器名字')
    • 2.定義函式的時候,直接使用系統過濾器進行裝飾

      @app.template_filter('過濾器名字')
      def 函式名():
          pass
      
    • 案例:

    • 1.獲取串列偶數和

    • 2.反轉串列

from flask import Flask,render_template

app = Flask(__name__)

# 1.先定義好函式,再將函式添加到系統默認的過濾器串列中
def get_oushu(list):
    print(list)
    sum = 0
    for i in list:
        if i %2 == 0:
            sum += i

    return sum
#引數1: 關聯的函式名稱,  引數2: 在模板中使用的過濾器名字
app.add_template_filter(get_oushu,"oushu")


# 2.定義函式的時候,直接使用系統過濾器進行裝飾
@app.template_filter("reverse")
def listreverse(list):
    list.reverse()
    return list



@app.route('/')
def hello_world():

    return render_template("custom_filter.html")

if __name__ == '__main__':
    app.run(debug=True)

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <h2>原串列: {{ [1,2,3,4,5,6] }}</h2>
    <h2>偶數串列: {{ [1,2,3,4,5,6] | oushu }}</h2>
    <h2>反轉串列: {{ [1,2,3,4,5,6] | reverse }}</h2>
    <h2>降序串列: {{ [1,2,3,4,5,6,10,9,7] | sort | reverse }}</h2>

</body>
</html>

十一、代碼復用之宏

  • 解釋: 相當于python中的函式,定義好一段功能,在需要的時候進行呼叫即可

  • 定義格式:

    {% macro 宏名(引數) %}
    
    {% endmacro %}
    
  • 使用格式:

    // 使用當前檔案定義好的宏
    {{ 宏名(引數) }}
    
    //使用其他檔案定義好的宏
    {% import '檔案' as 別名%}
    {{ 別名.宏名(引數) }}
    
from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def hello_world():

    return render_template("file07macro.html")

if __name__ == '__main__':
    app.run(debug=True)

使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    {# 定義宏 #}
    {% macro my_macro(name,password) %}
        用戶名: <input type="text" value="https://www.cnblogs.com/mengd/archive/2020/10/04/{{ name }}"><br>
        密碼: <input type="password" value="https://www.cnblogs.com/mengd/archive/2020/10/04/{{ password }}"><br>
    {% endmacro %}

    {# 呼叫當前檔案宏 #}
    {{ my_macro("zhangsan","111111") }}


    {# 使用其他檔案的宏 #}
    {% import 'othermacro.html' as other %}
    {{ other.my_input() }}
    {{ other.my_div() }}


</body>
</html>

othermacro.html

{% macro my_macro(name,password) %}
    用戶名: <input type="text" value="https://www.cnblogs.com/mengd/archive/2020/10/04/{{ name }}"><br>
    密碼: <input type="password" value="https://www.cnblogs.com/mengd/archive/2020/10/04/{{ password }}"><br>
{% endmacro %}


{% macro my_input() %}

    <h1>這是一個其他檔案的宏</h1>

{% endmacro %}


{% macro my_div() %}

    <div style="color: red;">我是一個孤獨的div</div>

{% endmacro %}

十二、代碼復用之繼承

  • 解釋: 一個子模板繼承自父模板

  • 作用: 共性抽取,代碼復用

  • 父模板

    • 1.所有子類都具有的相同的內容的, 在父模板中直接寫死
    • 2.每個子類的模板中不一樣的內容,使用block模板定義好
  • 子模板

    • 1.根據子類自己的需求,去重寫父類中的block對應的內容
    • 2.如果重寫之后,還想保留父類的內容,那么使用{{super()}}
    • 3.繼承格式: {% extends '父檔案名'%}, 寫在頁面的頂部
  • 注意點:

    • 定義block的格式

      {% block 名稱 %}
      
      {% endblock %}
      
from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def hello_world():

    # return render_template("file09zi.html")
    return render_template("file10zi.html")

if __name__ == '__main__':
    app.run(debug=True)

file11fu.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    {# 頭部部分 #}
    {% block titleBlock %}
        <h1>靜夜思</h1>
    {% endblock %}

    {# 正文部分 #}
    {% block contentBlock %}

    {% endblock %}


    {# 底部部分 #}
    <div>
        <a href="https://www.cnblogs.com/mengd/archive/2020/10/04/#">點我有驚喜</a>
    </div>

</body>
</html>

file09zi.html

{% extends 'file11fu.html' %}

{# 重寫正文部分 #}
{% block contentBlock %}
    <p>
        床前一鍋湯,<br>
        撒了一褲襠, <br>
        抬頭拿抹布, <br>
        低頭擦褲襠 <br>
    </p>
{% endblock %}


{#<!DOCTYPE html>#}
{#<html lang="en">#}
{#<head>#}
{#    <meta charset="UTF-8">#}
{#    <title>Title</title>#}
{#</head>#}
{#<body>#}
{##}
{#    <h1>靜夜思</h1>#}
{##}
{#    <p>#}
{#        床前一鍋湯,<br>#}
{#        撒了一褲襠, <br>#}
{#        抬頭拿抹布, <br>#}
{#        低頭擦褲襠 <br>#}
{#    </p>#}
{##}
{#    <div>#}
{#        <a href="https://www.cnblogs.com/mengd/archive/2020/10/04/#">點我有驚喜</a>#}
{#    </div>#}
{##}
{##}
{#</body>#}
{#</html>#}

file10zi.html

{% extends 'file11fu.html' %}

{# 重寫父類titleBlock內容 #}
{% block titleBlock %}
    {{ super() }}
    <h1>新靜夜思</h1>
{% endblock %}

{# 重寫父類中的contentBlock內容 #}
{% block contentBlock %}
    <p>
        床前明月光,<br>
        疑似地上霜, <br>
        舉頭望明月, <br>
        低頭思故鄉 <br>
    </p>
{% endblock %}

{#<!DOCTYPE html>#}
{#<html lang="en">#}
{#<head>#}
{#    <meta charset="UTF-8">#}
{#    <title>Title</title>#}
{#</head>#}
{#<body>#}
{##}
{#    <h1>靜夜思</h1>#}
{##}
{#    <p>#}
{#        床前明月光,<br>#}
{#        疑似地上霜, <br>#}
{#        舉頭望明月, <br>#}
{#        低頭思故鄉 <br>#}
{#    </p>#}
{##}
{#    <div>#}
{#        <a href="https://www.cnblogs.com/mengd/archive/2020/10/04/#">點我有驚喜</a>#}
{#    </div>#}
{##}
{##}
{#</body>#}
{#</html>#}

十三、代碼復用之包含

  • 解釋: 在一個檔案中完全擁有另外一個檔案,不夠靈活,沒法擴展

  • 格式:

    方式一:
    {% include '檔案' %}
    
    方式二:
    {% include '檔案' ignore missing %}
    
    
  • 注意點: ignore missing 如果包含的檔案不存在,也不會報錯

十四、模板使用練習

  • 題目: 給出5條資料,顯示前四條
"""
給定如下5條資料,只顯示4行資料,背景顏色依次為:黃,綠,紅,紫
my_list = [
    {
        "id": 1,
        "value": "我愛作業"
    },
    {
        "id": 2,
        "value": "作業使人快樂"
    },
    {
        "id": 3,
        "value": "沉迷于作業無法自拔"
    },
    {
        "id": 4,
        "value": "日漸消瘦"
    },
    {
        "id": 5,
        "value": "以夢為馬,越騎越傻"
    }
]
"""
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def hello_world():

    #1.定義5條資料
    my_list = [
        {
            "id": 1,
            "value": "我愛作業"
        },
        {
            "id": 2,
            "value": "作業使人快樂"
        },
        {
            "id": 3,
            "value": "沉迷于作業無法自拔"
        },
        {
            "id": 4,
            "value": "日漸消瘦"
        },
        {
            "id": 5,
            "value": "以夢為馬,越騎越傻"
        }
    ]

    #2.在模板中顯示4條
    return render_template("practice.html",list=my_list)

if __name__ == '__main__':
    app.run(debug=True)

practice.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <ul>
        {# 如果dict.id 不等于5才遍歷 #}
        {% for dict in list if dict.id !=5 %}

            {# 方式一 #}
{#            {% if dict.id == 1 %}#}
{#                <li style="background: yellow;"> {{ dict.value }} </li>#}
{#            {% elif dict.id == 2 %}#}
{#                <li style="background: green;"> {{ dict.value }} </li>#}
{#            {% elif dict.id == 3 %}#}
{#                <li style="background: red;"> {{ dict.value }} </li>#}
{#            {% else %}#}
{#                <li style="background: purple;"> {{ dict.value }} </li>#}
{#            {% endif %}#}

            {# 遍歷的時候可以獲取到從0開始的索引 #}
{#            <h3>{{ loop.index0  }}</h3>#}

            {# 遍歷的時候可以獲取到從1開始的索引 #}
{#            <h3>{{ loop.index  }}</h3>#}


            {# 方式二 #}
            {% if loop.index == 1 %}
                <li style="background: yellow;"> {{ dict.value }} </li>
            {% elif loop.index == 2 %}
                <li style="background: green;"> {{ dict.value }} </li>
            {% elif loop.index == 3 %}
                <li style="background: red;"> {{ dict.value }} </li>
            {% else %}
                <li style="background: purple;"> {{ dict.value }} </li>
            {% endif %}



        {% endfor %}
    </ul>


</body>
</html>

十五、模板特有變數

  • 解釋: 不需要通過python程式傳遞就可以直接使用的變數
  • 常見的特有變數如下:
    • config: 就是flask中的app.config, 表示應用程式中的所有配置資訊
    • request: 表示請求背景關系物件,封裝的是請求相關的資料
    • g: 區域的全域變數(了解)
    • url_for(): 反決議,通過函式的名字,決議到視圖函式的路徑
    • get_flashed_messsages(): 用來消耗flash方法中存盤的訊息.
      • 場景: 登陸出錯,可以顯示
      • 注意點:
      • 1.使用flash存盤訊息的時候需要設定SECRET_KEY
      • 2.因為flash內部的訊息存盤,依賴于了session
from flask import Flask,render_template

app = Flask(__name__)
app.config["SECRET_KEY"] ="hahaha"
@app.route('/')
def hello_world():

    return render_template("special_variable.html")

@app.route('/test/<int:age>')
def test(age):
    return "test..."


if __name__ == '__main__':
    app.run(debug=True)

special_variable.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <h2>config變數: {{ config }}</h2>
    <h2>request: {{ request.method }}</h2>
    <h2>request: {{ request.url }}</h2>
    <h2>url_for(): {{ url_for("hello_world") }}</h2>
    <h2>url_for(): {{ url_for("test",age=100) }}</h2>

</body>
</html>

get_flashed_messsages()的使用

from flask import Flask,render_template,flash

app = Flask(__name__)
app.config["SECRET_KEY"] = "onjgtex"

@app.route('/')
def hello_world():

    return render_template("flash.html")

@app.route('/test')
def test():
    #存盤訊息
    flash("登陸成功")

    return "test"

if __name__ == '__main__':
    app.run(debug=True)

flash.html

用來消耗flash方法中存盤的訊息

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    {{ get_flashed_messages() }}

</body>
</html>

十六、csrf攻擊流程

  • 解釋: 跨站點請求偽造
  • 掌握: 需要理解講義中的攻擊流程圖
  • 代碼演示: webA, webB

十七、csrf攻擊手動解決

  • 在cookie增加一個csrf_token
  • 在表單中增加一個csrf_token
  • 校驗: 取出cookie和表單中的csrf_token比較如果二者一致那么是正常請求
  • 具體程序,看keynote圖解

十八、CSRFProtect解決csrf

  • 使用流程:
    • 1.安裝擴展包
      • pip install flask-wtf
    • 2.匯入包
      • from flask_wtf.csrf import CSRFProtect
    • 3.設定SECRET_KEY,便于csrf_token加密
    • 4.創建CSRFProtect物件,保護app物件
    • 5.需要在表單中設定csrf_token隱藏欄位即可
    • 例子: 注冊案例
    • 注意點: CSRFProtect一旦保護了app之后, 會對'POST', 'PUT', 'PATCH', 'DELETE'做校驗.
from flask import Flask, render_template, request
from flask_wtf.csrf import CSRFProtect


app = Flask(__name__)

# 1. 先設定密鑰
app.config["SECRET_KEY"] = "weorinsaiudfhnb"
# 2. 保護app
CSRFProtect(app)


@app.route('/', methods=["GET", "POST"])
def index():
    if request.method == "POST":
        # 獲取到引數
        username = request.form.get("username")
        password = request.form.get("password")
        repassword = request.form.get("repassword")

        # 校驗引數
        if not all([username, password, repassword]):
            return "引數填寫不全"

        # 判斷兩次的密碼是否一致
        if password != repassword:
            return "兩次密碼輸入不一致,請重新輸入"

        return "注冊成功"

    else:
        return render_template("register.html")


if __name__ == '__main__':
    app.run()

對應的register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/" method="post">
    {# 3. 只要使用了CSRFProtect保護app,就可以直接使用csrf_token()作為value值       #}
        <input type="hidden" name="csrf_token" value="https://www.cnblogs.com/mengd/archive/2020/10/04/{{ csrf_token() }}">

        用戶名:<input type="text" name="username"><br>
        密碼:<input type="password" name="password"><br>
        確認密碼:<input type="password" name="repassword"><br>
        <input type="submit" value="https://www.cnblogs.com/mengd/archive/2020/10/04/注冊">
    </form>
</body>
</html>

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/155883.html

標籤:其他

上一篇:QueryRunner類結果集處理的八種方法

下一篇:win7 配置AMP環境(apache2.4.39 + php7.1.28)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more