Flask框架【六】—flask中的session

Flask中的session

1.session设置

Flask除请求对象之外,还有一个 session 对象。

它允许你在不同请求间存储特定用户的信息。它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使用会话,你需要设置一个密钥。

我们知道,在django中的session是存储在服务器中的数据库中的,也就是django_session表中,而flask中的session是交由客户端保管的,也就是存储在本地的cookie中。

session的方法:

  • session['username'] = 'ryxiong';设置session

  • session.pop("username",None);删除session

关于session的设置

app.session_cookie_name = "I am not Session"

其他配置

'SESSION_COOKIE_NAME':                  'session',  # 设置session的名字
'SESSION_COOKIE_DOMAIN':                None,
'SESSION_COOKIE_PATH':                  None,
'SESSION_COOKIE_HTTPONLY':              True,
'SESSION_COOKIE_SECURE':                False,
'SESSION_REFRESH_EACH_REQUEST':         True,  # 是否每次都跟新
'PERMANENT_SESSION_LIFETIME':           timedelta(days=31)  
# 设置session的过期时间

2.cookies中的session

cookies 中 session 存储的是通过 secret_key 加密后的 key , 通过这个 key 从flask程序的内存中找到用户对应的session信息

session序列化机制

当我们开启session时,设置session["username"]="ryxiong",flask会帮我们创建一个字典{"username":"ryxiong"},然后通过secret_key + 时间戳 + 签名经过加密生成一个字符串。

session反序列化机制

当客户端发送请求时,request请求会带上cookie,也就是session中的数据存储在其中,这个数据就是之前加密后的字符串,发送到后端后,flask会通过secret_key去解密session中的加密字符串,从而获取{"username":"ryxiong"}从而来验证是否登录。

3.session的使用和验证

from flask import Flask, session, redirect, url_for, escape, request
 
app = Flask(__name__)
 
@app.route('/')
def index():
    if 'username' in session:
        return 'Logged in as %s' % escape(session['username'])
    return 'You are not logged in'
@app.route("/login", methods=["GET", "POST"])
def login(): if request.method == "POST": if request.form["username"] == USER["username"] and request.form["password"] == USER["password"]: session["user"] = USER["username"] return redirect("/student_list") return render_template("login.html", msg="用户名密码错误") return render_template("login.html", msg=None) # 如果前端Jinja2模板中使用了msg,这里就算是传递None也要出现msg # session的验证 @app.route("/student_list") def student(): if session.get("user"): return render_template("student_list.html", student=STUDENT_DICT) return redirect("/login")

 

posted @ 2019-07-11 16:42  ryxiong728  阅读(467)  评论(0编辑  收藏  举报