記錄#
- 今天學習的是 HTTP & SESSION。session 是一種存儲方法,在使用者的電腦中存儲一些與使用者相關的內容。
- 在存儲 session 之前需要先建立 seeion_key,這個 key 不能洩漏,否則使用者的資訊不安全。所以要把 key 存在環境變量中。
app.secret_key = os.environ['sessionKey']
- 需要存儲的時候,調用 session 數據賦值就可以了。比如:
session["myName"]
- 使用
session.get("myName")
來判斷變量是否存在。 - 使用
session.clear()
清除所有 session - 今天的練習是在昨天的基礎之上增加用戶名緩存的功能和註銷的功能。
- 在今天的練習中還學了一個新的知識點,在 route 的設定中可以存在兩個相同名稱的路由,但後面的方法不能一樣。就像代碼中的 login 路由。
CODE#
from flask import Flask, request, redirect, session
from replit import db
import os
app = Flask(__name__, static_url_path='/static')
app.secret_key = os.environ['secret_key']
@app.route("/")
def index():
if session.get("name"):
return redirect("/login")
else:
page = """
<p><a href="/sign">註冊</a></p>
<p><a href="/log">登錄</a></p>
"""
return page
@app.route("/sign")
def sign():
if session.get("name"):
return redirect("/login")
else:
f = open("sign.html", "r")
page = f.read()
f.close
return page
@app.route("/signup", methods=["POST"])
def signup():
if session.get("name"):
return redirect("/login")
else:
user = request.form
if user["username"] not in db.keys():
db[user["username"]] = {
"username": user["username"],
"name": user["name"],
"password": user["password"]
}
session["name"] = user['name']
page = f"你好 {session['name']}"
else:
page = f"{user['username']} 已存在"
return page
@app.route("/log")
def log():
if session.get("name"):
return redirect("/login")
else:
f = open("login.html", "r")
page = f.read()
f.close
return page
@app.route("/login", methods=["GET"])
def sessionlogin():
if session.get("name"):
page = f"<h1>你好 {session['name']}</h1><p><a href='/reset'>重置</a></p>"
return page
@app.route("/login", methods=["POST"])
def login():
user = request.form
if db[user["username"]]["username"] == user["username"] and db[
user["username"]]["password"] == user["password"]:
session["name"] = db[user["username"]]["name"] # 將用戶姓名存入會話
return redirect("/login")
else:
page = "用戶名或密碼錯誤"
return page
@app.route("/reset")
def reset():
session.clear()
return redirect("/log")
app.run(host='0.0.0.0', port=81)