iT邦幫忙

2022 iThome 鐵人賽

DAY 30
0
Modern Web

flask系列 第 30

Day30 Session

  • 分享至 

  • xImage
  •  

Server 和 Client 不會一直保持連線狀態,無法取得雙方的狀態,所以使用了 Session,Session就像是商店的會員卡,給顧客一個卡片,只要顧客使用這張卡片,商店本身就可以查到使用者的資料。
Session可以細分為兩種:

1.Server Side Session
資訊儲存在 Server 那側,並且 Server 只交給使用者一個 session_id。只要使用者拿著這個 ID,Server 就可去找到資料來認識使用者。

2.Client Side Session
資訊加密過後,儲存在 Client 的 Cookie 上,並且理論上只有 Server 端能夠解密看到原始的資訊。

Flask 本身所使用的 Session 是屬於 Client Side Session。要做到 Server Side Session 能透過 Flask-Session 這個擴充套件達成。

SECRET_KEY

在使用 Session 前我們需要先生成一個 SECRET_KEY
python -c "import os;print(os.urandom(16))"
執行完後界可以得到一組隨機產生的 SECRET_KEY,然後在 configs.py 中設定
configs.py

ENV = 'development'
DEBUG = True
SECRET_KEY = b'%\x9e\xa7s5\xe9\xcf\x96.\xe6T\xfdqf\xde\x0f' # 這個最好自己生成

Session 其他相關設定:

  • PERMANENT_SESSION_LIFETIME:設置 session 的有效期 = Cookie 的過期時間,單位是秒。默認 Session 是永久,當 session.permanent 為 True 時才會套用
  • SESSION_COOKIE_NAME: 返回給客戶端的 Cookie 的名稱,默認是 "session"
  • SESSION_COOKIE_DOMAIN: 設置 Session 的 Domain
  • SESSION_COOKIE_PATH: 設置 Session 的 Path
  • SERVER_NAME: 設置 Server name,不常使用
  • SESSION_COOKIE_SECURE: 如果為 True,那麽只會使用 HTTPS 發送,默認為 False
  • APPLICATION_ROOT: 根路徑
  • SESSION_REFRESH_EACH_REQUEST: 是否應該為每一個請求設置cookie,默認為True,如果為False則必須顯性調用set_cookie函數
  • SESSION_COOKIE_HTTPONLY:默認為 True,表示允許 JavaScript 使用 Cookie

設置 Session

index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>index</title>
</head>
<body>
    <div>
        {% if username %}
        <h1>Welcome {{ username }}</h1>
        {% else %}
        <h1>Hello</h1>
        {% endif %}
    </div>
</html>

app.py

import configs as CONFIGS
from flask import Flask, render_template, url_for, redirect, request, make_response, session


app = Flask(__name__)
app.config.from_object(CONFIGS)


@app.route("/")
def index():
    if 'username' in session:
        name = session['username']  # 取得session
    else:
        name = None
    response = make_response(render_template('index.html', username=name))
    return response


@app.route("/login_session", methods=["GET", "POST"])
def login_session():
    username = request.values.get("username", None)
    response = make_response(redirect(url_for("index")))
    session["username"] = username # 建立session
    return response

執行結果


上一篇
Day29 Cookie
系列文
flask30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言