- 客户端会话技术:cookie
- 服务端会话技术:session
- 自定义会话技术:token
一.cookie
cookie本身由服务器端生成,通过Response将cookie写到浏览器上,下一次再次访问时,浏览器会根据不同的规则自动携带cookie过来
#服务端设置cookie:
response.set_cookie(key,value[,max_age=None,exprise=None)]
def set_cookie(request):
response = HttpResponse("设置Cookie") #这里response =redirct()或者response =render()也是可以的
response.set_cookie('username', 'Rock')
return response
"""
HTTP响应报文里面会有:set_cookie:username=Rock
"""
#服务端获取cookie:
request.GET.get(key,defaultvalue)
def get_cookie(request):
username = request.COOKIES.get("username")
return HttpResponse(username)
#要求浏览器删除cookie
def logout(request):
response = redirect(reverse("app:login"))
response.delete_cookie("content")
return response
response.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)
key: cookie的name
value:cookie的值
max_age:cookie存活时间,单位是秒
expires:具体过期时间
path:cookie的访问路径,只有在某个路径下访问才带上该cookie
domain:域名,只有在某个域名下访问
secure:安全
httpoly:如果为True那么js就不能获取cookie
set_signed_cookie(key, value, salt='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=True)设置加密的cookie,salt是秘钥,对value进行了加密处理
response.set_signed_cookie('content', uname, "Rock")
uname = request.get_signed_cookie("content", salt="Rock")
二. session
#session表里面有字段session_key、session_data、expire_date
#服务器设置session
def login(request):
if request.method == "GET":
return render(request, 'two_login.html')
elif request.method == "POST":
username = request.POST.get("username")
request.session["username"] = username
return HttpResponse("登录成功")
"""
HTTP响应报文里面会有:set_cookie:sessionid= 一串hash编码(这个是服务器帮你生成的)
session表里面的字段session_key: 一串hash编码
session_data : 混淆串 {"username": "jam"}
"""
#服务器获取session
def mine(request):
username = request.session.get("username")
return render(request, 'two_mine.html', context=locals())
#要求浏览器删除sessionid
response.delete_cookie('sessionid')
#删除session表里面的session_data
del request.session['username']
#session 和cookie 一起删
def logout(request):
response = redirect(reverse('two:mine'))
# del request.session['username']
# response.delete_cookie('sessionid')
# session cookie一起干掉
request.session.flush()
return response
django中启用SESSION
settings中
INSTALLED_APPS:'django.contrib.sessions'
MIDDLEWARE:'django.contrib.sessions.middleware.SessionMiddleware'
每个HttpRequest对象都有一个session属性,也是一个类字典对象
常用操作:
get(key,default=None) 根据键获取会话的值
clear() 清楚所有会话
flush() 删除当前的会话数据并删除会话的cookie
delete request['session_id'] 删除会话
session.session_key获取session的key
设置数据 :
request.session[‘user’] = username
数据存储到数据库中会进行编码使用的是Base64
三. token
token一般只要是唯一就行,生成方法有很多种
class Student(models.Model):
s_name = models.CharField(max_length=16, unique=True)
s_password = models.CharField(max_length=128)
s_token = models.CharField(max_length=256)
#以ip+时间戳+用户名来生成
def generate_token(ip, username):
c_time = time.ctime()
r = username
return hashlib.new("md5", (ip + c_time + r).encode("utf-8")).hexdigest()