Flask基礎之session驗證與模板渲染語法(jinja2)

1.http傳輸請求頭參數

request.headres 之 請求頭中數據顯示:前端

print(type(request.headers))
    """
    Host: 127.0.0.1:5000
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate
    Referer: http://127.0.0.1:5000/home
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 26
    Cookie: csrftoken=vDIozqveCEfArdYXlM6goHVlSQEn7h4bDygNphL2Feas60DiM2di0jlqKfxo7xhA
    Connection: keep-alive
    Upgrade-Insecure-Requests: 1
    Cache-Control: max-age=0
    """

2.Flask中request.data參數處理

request.data 之 若是處理不了的就變成字符串兒存在data裏面python

request 是基於 mimetype 進行處理的json

mimetype的類型 以及 字符串兒 : http://www.w3school.com.cn/media/media_mimeref.aspflask

若是不屬於上述類型的描述,request就會將沒法處理的參數轉爲Json存入到 data 中後端

其實咱們能夠將 request.data , json.loads 一樣能夠拿到裏面的參數cookie

其餘request參數:session

request.獲取各類路徑之這些方法不必記,可是要知道它存在


    # 獲取當前的url路徑
    print(request.path)# /req
    # 當前url路徑的上一級路徑
    print(request.script_root) #
    # 當前url的所有路徑
    print(request.url) # http://127.0.0.1:5000/req
    # 當前url的路徑的上一級所有路徑
    print(request.url_root ) # http://127.0.0.1:5000/

3.Flask中request.json參數

request.json 數據在提交數據時,須要指定參數的格式是json格式app

若是在請求中寫入了 "application/json" 使用 request.json 則返回json解析數據, 不然返回 None函數

4.Flask中的session管理

Flask中的session是flask自帶的模塊

session生成機制:先建立一個字典,再secret_key + 時間戳 + flask內置簽名 加密 造成

  • secret_key :能夠任意指定一個加密字符串
  • 時間戳:保存session的過時時間
  • 簽名:內置簽名,應用於session加密

  實例:

from datetime import timedelta
from flask import Flask, session, request, render_template, redirect

app = Flask(__name__)
# 隨機建立一個session的key
app.secret_key = "#$%^&*#$%^&#$%2213123^&"
# 調試模式
app.debug = True
# 更改session的名字
app.session_cookie_name = "I am Not Session"


# 設置session的過時時間,15秒
# app.permanent_session_lifetime = 15


@app.route("/login", methods=["POST", "GET"])
def login():
    if request.method == "GET":
        return render_template("login.html")
    else:
        uname = request.form.get("username")
        pwd = request.form.get("pwd")

        if uname == "123" and pwd == "123":
            # 設置session
            session["username"] = uname
            return "200 OK"
        else:
            return "登陸失敗!"


@app.route("/detail")
def detail():
    # 驗證session設置是否成功
    if session.get("username"):
        return render_template("index.html")
    else:
        return redirect("/login")


if __name__ == '__main__':
    app.run("0.0.0.0", 9527)

  HTML文件:

...
<form action="" method="post" enctype="multipart/form-data">
    用戶名:<input type="text" name="username">
    密碼:<input type="password" name="pwd">
    <input type="submit" value="提交">
</form>
...

5.Flask中模板語法(if,for語法數據處理)

  falsk模板語法是基於jinja2語法實現

from flask import Flask, render_template

STUDENT = {'name': 'Old', 'age': 38, 'gender': '中'}

STUDENT_LIST = [
    {'name': 'Old', 'age': 38, 'gender': '中'},
    {'name': 'Boy', 'age': 73, 'gender': '男'},
    {'name': 'EDU', 'age': 84, 'gender': '女'}
]

STUDENT_DICT = {
    1: {'name': 'Old', 'age': 38, 'gender': '中'},
    2: {'name': 'Boy', 'age': 73, 'gender': '男'},
    3: {'name': 'EDU', 'age': 84, 'gender': '女'},
}

app = Flask(__name__)
app.debug = True

@app.route("/index")
def index():
    return render_template("index1.html",
                           stu_info=STUDENT,
                           stu_list=STUDENT_LIST,
                           sd=STUDENT_DICT)


if __name__ == '__main__':
    # 定義訪問ip與port
    app.run("0.0.0.0", 9527)

  HTML文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{# 普通字典數據處理 #}
{{ stu_info }}
<table border="1ps">
    <tr>
        <td>name</td>
        <td>age</td>
        <td>gender</td>
    </tr>
    <tr>
        <td>{{ stu_info.name }}</td>
        <td>{{ stu_info.age }}</td>
        <td>{{ stu_info.gender }}</td>

    </tr>
</table>
{# 列表中嵌套字典數據的處理 #}
<hr>
{{ stu_list }}
<table border="1ps">
    <tr>
        <td>name</td>
        <td>age</td>
        <td>gender</td>
    </tr>
    {% for foo in stu_list %}
    <tr>
        <td>{{ foo.name }}</td>
        <td>{{ foo.age }}</td>
        {% if foo.gender != "男" and foo.gender != "女" %}
            <td>女</td>
        {% else %}
            <td>{{ foo.gender }}</td>
        {% endif %}
    </tr>
    {% endfor %}
</table>
{# 字典數據類型處理 #}
<hr>
{{ sd }}
<table border="1ps">
    <tr>
        <td>name</td>
        <td>age</td>
        <td>gender</td>
    </tr>
    {% for k,v in sd.items() %}
        <tr>
            <td>{{ v.name }}</td>
            <td>{{ v.age }}</td>
            <td>{{ v.gender }}</td>
        </tr>
    {% endfor %}
</table>


</body>
</html>

6.Flask中模板語法(自定義函數方法)

經過定義全局變量的方法,不須要導入則能夠直接在模板中使用:

from flask import Flask, render_template  #裝飾自定義方法

app = Flask(__name__)
app.debug = True


# 自定義方法,這裏裝飾的函數是一個全局變量
@app.template_global()
def ab(a, b):
    return a + b
@app.template_filter()  # 定義全局模板函數
def a_b_c_sum(a, b, c):
    return a + b + c
@app.route("/index")
def index():
    return render_template("index1.html")


if __name__ == '__main__':
    # 定義訪問ip與port
    app.run("0.0.0.0", 9527)

HTML文件:輸出結果3

...
<body>

<h3>自定義的方法ab</h3>
輸出結果:{{ ab(1,2) }}
<br>
    {{ 1 | a_b_c_sum(197,2) }}
</body> </html>

7.Flask中模板語法(後端建立標籤)

7.1 後端經過Markup方法實現標籤:

後端建立一個字符串標籤,經過Markup指定字符串是一個標籤,不然前端則會顯示一個字符串

from flask import Flask, render_template, Markup

app = Flask(__name__)
app.debug = True


@app.route("/index")
def index():
    # Markup標籤轉義,字符串轉換成標籤
    my_in = Markup("<input type='text' name='uname'>")
    return render_template("index1.html", m=my_in)


if __name__ == '__main__':
    # 定義訪問ip與port
    app.run("0.0.0.0", 9527)

HTML文件:

...
<body>

<hr>經過後端代碼建立一個標籤:
輸入框:{{ m }}

</body>
</html>

7.2 前端經過safe過濾器實現標籤:

from flask import Flask, render_template

app = Flask(__name__)
app.debug = True


@app.route("/index")
def index():
    my_in = "<input type='text' name='uname'>"
    return render_template("index1.html", m=my_in)


if __name__ == '__main__':
    # 定義訪問ip與port
    app.run("0.0.0.0", 9527)

  HTML文件:

...
<body>

<hr>經過前端過濾器建立一個標籤:
輸入框:{{ m | safe }}   

</body>
</html>

8.Flask中模板語法(macro方法)

from flask import Flask, render_template


app = Flask(__name__)
app.debug = True


@app.route("/index")
def index():
    return render_template("index1.html")


if __name__ == '__main__':
    # 定義訪問ip與port
    app.run("0.0.0.0", 9527)

HTML文件:

mscro是直接在前端實現標籤的建立,目前有點雞肋,沒什麼用處

...
<body>

<hr>經過macro方式建立一個標籤:
{% macro my_input(na, ny) %}
    <input type="{{ ny }}" name="{{ na }}">
{% endmacro %}

輸入框:{{ my_input("uname", "type") }}

</body>
</html>

9.Jinja2模板複用 block

若是咱們前端頁面有大量重複頁面,不必每次都寫,可使用模板複用的方式複用模板

前端代碼:

index.html 文件中的內容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h2>下面的內容是不同的</h2>
    {% block content %}

    {% endblock %}
    <h2>上面的內容是不同的,可是下面的內容是同樣的</h2>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>Welcome OldboyEDU</h1>
    <h2>下面的內容是不同的</h2>
    {% block content %}

    {% endblock %}
    <h2>上面的內容是不同的,可是下面的內容是同樣的</h2>
    <h1>OldboyEDU is Good</h1>
</body>
</html>

login.html 文件中的內容

{% extends "index.html" %}
{% block content %}
    <form>
        用戶名:<input type="text" name="user">
        密碼:<input type="text" name="pwd">
    </form>
{% endblock %}
{% extends "index.html" %}
{% block content %}
    <form>
        用戶名:<input type="text" name="user">
        密碼:<input type="text" name="pwd">
    </form>
{% endblock %}

後端代碼:

from flask import Flask
from flask import render_template

app = Flask(__name__)


@app.route("/login")
def login():
    return render_template("login.html")


@app.route("/home")
def home():
    return render_template("home.html")


app.run("0.0.0.0", 5000, debug=True)

10.Jinja2模板語言的模塊引用 include

include模板語法:就是將 login.html 當成一個模塊,加載到 index.html 頁面中

login.html 文件中的內容:

<form>
    用戶名:<input type="text" name="user">
    密碼:<input type="text" name="pwd">
</form>

index.html 文件中的內容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>Welcome</h1>
    <h2>下面的內容是不同的</h2>
    {% include "login.html" %}
    <h2>上面的內容是不同的,可是下面的內容是同樣的</h2>
</body>
</html>

後端代碼:

from flask import Flask
from flask import render_template

app = Flask(__name__)


@app.route("/")
def index():
    return render_template("index.html")


app.run("0.0.0.0", 5000, debug=True)
相關文章
相關標籤/搜索