Http是一种无状态协议,若要实现状态保持,可以通过两种方式:cookie 和 session
1.设置cookie,本质上就是设置响应头上的值而已,所以有两种方式:
@app.route("/")
def demo1():
response = make_response(u"创造一个响应")
response.set_cookie("name","heima")---------------------------第1种方式
response.set_cookie("age","18",max_age = 3600)-----------------------也可设置过期时间,单位是秒
response.headers["Set-Cookie"] = "gender=11; Expires=Thu, 30-Nov-2017 13:43:32 GMT; Max-Age=3600; Path=/"-----------------------第2种方式
return response
2.获取cookie
@app.route("/get_cookie")
def demo2():
age = request.cookies.get("age")
return "cookie %s" % age
3.删除cookie---逻辑删除,并非真正意义上的删除,只是设置过期时间为创建时间。
@app.route("/delete_cookie")
def demo3():
response = make_response("delete success")
response.delete_cookie("age")
return response
1.设置session:必须设置secret_key
@app.route("/set_session")
def demo4():
session["user_id"] = "18"
return "set success"
RuntimeError: the session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret.
app.secret_key = "aaa" 点击进去:
#: If a secret key is set, cryptographic components can use this to
#: sign cookies and other things. Set this to a complex random value
#: when you want to use the secure cookie for instance.
检查:Set-Cookie:session=eyJ1c2VyX2lkIjp7IiBiIjoiTVRnPSJ9fQ.DQKgzg.P7z3XyoYpibeyAx3poMbszf7caI; HttpOnly; Path=/
一般情况下,secret_key设置越复杂越好,否则会被反解出来的,我们可以通过:操作终端进行加密
import os
os.urandom(48)
u=os.urandom(48)
import base64
base64.b64encode(u)
Out[6]: 'fet//U1RWo7LDdGLFsNVLGY5FA7iBgzSJyz1xx9K4iPhyjPwYI34RPqCs6zJ+SM5'
secret_key= 'fet//U1RWo7LDdGLFsNVLGY5FA7iBgzSJyz1xx9K4iPhyjPwYI34RPqCs6zJ+SM5'
2.获取session
@app.route("/get_session")
def demo5():
user_id = session.get("user_id")
return "session %s" % user_id
3.session扩展机制:
问题:
(1)当浏览器不支持cookie保存肿么办?思路:如何解决问题以及解决问题以后还会出现的问题。可以把session保存在url当中,但是下次访问时候,依然还是要全部输入sid;
(2)后端如何判断客户端是否可以保存cookie?思路:设置session,如果取不到说明不能保存或者cookie关闭;
(3)现在session一般保存在Mysql或者Redis数据库中,因为访问多个服务器时候会很麻烦。