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

6、token

posted @ 2019-12-04 22:28  W文敏W  阅读(258)  评论(0编辑  收藏  举报