flask之cookie与session区别

  用户身份校验是web访问时的重要步骤。常用的身份校验方式有cookie,session和jwt三种。其中cookie和session是较传统的校验方式,其采用将用户信息保存在服务器或浏览器中,用户访问时,携带相关信息,有服务器进行校验。最近流行的JWT令牌是一种分布式的跨域验证机制造。其允许跨域,另外将token保存到浏览器,避免了采用数据库保存用户信息。在分布式服务器运行场合,其校验更加简单,高效。其由头部,载荷和签名三部分组成。头部一般是token的类型、加密方式的声明信息;载荷部分是token的用户身份信息,头部和载荷均采用base64算法进行加密。通过base64解密即可查阅用户信息,因此一般存放的是用户非机密信息。签名部分是通过将头部,载荷部分以及用户的加密字段进行加密生成的字符串,这部分信息用来验证令牌的有效性。

1.flask中session的保存有两种:自带的session类和flask_session包。自带的session类中,其session信息是保存在浏览器内,而非客户端。而采用flask_session包可以改变session的存储位置,可以存储到redis,sqlalchemy,mongodb,缓存等数据库中。利用session记录用户登录次数:

app=Flask(__name__)
app.secret_key="hellobaby"#用于加密session信息

#用户登陆后设置session信息
@app.route("/user")
def index():
    session["name"]="hello,user"
    session["count"]=1

    return "hello,"

#记录用户登陆的次数,
@app.route("/hello")
def user():
    name=session.get("name")
    count=session.get("count")
    print(count,9999)
    if not all([name,count]):
        return "请登陆"
    num=count+1
    session["count"]=num
    return str(num)

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

结果:查询session信息,因是加密,信息较安全。

Cookie:session=eyJjb3VudCI6MSwibmFtZSI6ImhlbGxvLHVzZXIifQ.EBTDCw.SKWftLjBdc-IiGlWqcgrS16BzHg

2.利用cookie记录用户登录次数

#用户登陆后设置cookie信息
@app.route("/user")
def index():
    resp=Response("hello")
    resp.set_cookie("name","user1",3600)
    resp.set_cookie("count", "1", 3600)#cookie的值1为str
    return resp

#记录用户登陆的次数,
@app.route("/hello")
def user():
    name=request.cookies.get("name")
    count=request.cookies.get("count")
    print(count,9999)
    if not all([name,count]):
        return "请登陆"
    num=str(int(count)+1)
    resp=Response(num)
    resp.set_cookie("count", num, 3600)
    return resp

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

调试:
虽然cookie可以保存用户信息,但信息较透明,容易被窃取。例如 获取到的信息: Cookie:name=user1; count=4



 3.基于flask_session包进行session信息的保存,其可以选择将session信息保存在redis,缓存或sqlalchemy,关系型数据库等。

app=Flask(__name__)
# app.secret_key="hellobaby"#用于加密session信息
class App_Config():
    SECRET_KEY="20e4f6b0-b631-4582-b2e0-00190c7d006f"
    SESSION_TYPE="redis"
    SESSION_PERMANENT=False
    SESSION_USE_SIGNER=True
    PERMANENT_SESSION_LEFTTIME=86400*2
    SESSION_REDIS=StrictRedis(host="127.0.0.1",port=6379)#建立redis连接

app.config.from_object(App_Config)
session1=Session(app)


#用户登陆后设置cookie信息
@app.route("/user")
def index():
    session["name"]="user1"
    session["count"]=1
    return " login sccess"

#记录用户登陆的次数,
@app.route("/hello")
def user():
    name=session.get("name")
    count=session.get("count")
    print(count,9999)
    if not all([name,count]):
        return "请登陆"
    num=str(int(count)+1)
    resp=Response(num)
    session["count"] = num
    return resp

if __name__ == '__main__':
    app.run(port=5006)
原文地址:https://www.cnblogs.com/xuehaiwuya0000/p/11140974.html