django—cookie和sessioon
目录
1、什么是cookie
1、由于BS架构基于HTTP协议,是无状态的,不能保存客户端状态
2、使用cookie/session技术可以保存客户端用户状态
3、cookie是服务端生成发送给客户端的键值对,浏览器会保存它
4、浏览器可以设置禁止cookie的写入,即不保存cookie
2、django中操作cookie
2.1 如何操作cookie
视图函数都是返回一个对象,只需要给这个对象进行操作就可以了
# 一般有三种方式返回数据
obj = HttpResponse()
return obj
obj = render()
return obj
obj = redirect()
return obj
2.2 操作cookie
1、生成cookie
# 生成cookie
obj.set_cookie('k1','v1',max_age=3)
obj.set_cookie('k1','v1',expires=3)
'''
1、客户端接收到的数据为键值对 k1:v1
2、参数max_age与expires都是设置cookies的有效时间,区别在于,当客户端为IE浏览器时,只能用expires
'''
2、服务端获取cookie
request.COOKIES.get('k1') # 获取cookie值
3、删除cookie
obj.delete_cookie('k1')
'''
删除cookie意味着注销客户端用户
定义注销视图函数即可'''
def logout(request):
obj = redirect('/login/')
obj.delete_cookie('user')
3、什么是session
1、在服务端基于cookie保存客户端状态的数据,一般存储在数据库中
2、每一个客户端的cookie分配唯一的一个id
4、django中操作session
4.1 创建cookie_session表
1、在django项目第一次创建表,迁移同步到数据库中时,会默认创建多个表,其中包括diango_sessioon表
2、在django_session表创建完成的情况下,才能操作session
4.2 操作session
1、设置session
request.session['k1'] = 'v1'
'''
1、使用的k1:v1键值对,是生成cookie的相同的键值对
2、django内部自动调用算法生成一个随机的字符串
3、django_session表中添加数据
以2中生成的字符串为主键session_key
给数据加密生成字符串,添加进session表中session_data
同时,自动生成session有效期限,mysql默认为14天
'''
2、获取session
request.session.get('k1')
'''
1、django内部会自动去请求头里面获取cookie
2、拿着session所对应的 随机字符串去django_session表中以一比对session_key
3、如果比对上了,获取对应的session_data,放入request.session中,以供程序员调用
4、如果没有比对上,那么request.session就是一个空字典
'''
3、删除session
request.session.delete()
'''
1、一个客户端对应django_session表中的一条数据
2、删除session,就是将该客户端对应的所有cookie删除
'''
4、设置失效时间
request.session.set_expiry(value)
'''
1、value是个整数,时间单位是秒
2、value是个datatime或者timedelta,那就是最后的有效期
3、value是0,用户关闭浏览器就会 失效
4、value是None,session会依赖全局session失效策略
'''
5、示例:登陆认证
1、校验cookie/session
2、验证不通过,重新登陆后自动跳转本来想要访问的页面
3、使用CBV模式
def login_auth(func):
def inner(request, *args, **kwargs):
next_url = request.get_full_path()
print(next_url)
print(request.session.get('username'))
if request.session.get('username'):
return func(request, *args, **kwargs)
else:
return redirect('/app01/login/%s/' % next_url)
return inner
class MyLogin(View):
def get(self, request):
return render(request, 'login.html')
def post(self, request):
username = request.POST.get('username')
password = request.POST.get('password')
user_obj = models.User.objects.filter(username=username, password=password)
if not user_obj:
return render(request, 'login.html')
request.session['username'] = username
url = reverse('home', kwargs={'username': username})
obj = redirect(url)
obj.set_cookie('username', username)
return obj
class MyHome(View):
@method_decorator(login_auth)
def get(self, request, username):
return render(request, 'home.html', {'username': username})
pass
def post(self, requeest, username):
pass