简介:
会话跟踪,解决保持状态的需求
Cookie:浏览器端存的键值对
Session:服务端存的键值对,底层依赖cookie

from django.shortcuts import render, HttpResponse, redirect # Create your views here. def login_auth(func): def inner(request, *args, **kwargs): url = request.get_full_path() # /shopping/?nana=ppp is_login = request.COOKIES.get('is_login') # xxx=request.get_signed_cookie('xxx',salt='123') # print(xxx) if is_login: ret = func(request,*args, **kwargs) else: return redirect('/login/?next=%s' % url) # /login/?next=/shopping/?nana=ppp return ret return inner def login(request): if request.method == 'POST': url = request.GET.get('next') name = request.POST.get('name') pwd = request.POST.get('pwd') if name == 'lqz' and pwd == '123': obj = redirect(url) obj.set_cookie('is_login', True,path='/shopping/') import datetime now = datetime.datetime.now().strftime('%Y-%m-%d %X') obj.set_cookie('last_time', now) obj.set_cookie('name', 'lqz') obj.set_cookie('pwd', '123') obj.set_signed_cookie('xxx','xxxxxx',salt='123') return obj else: obj = HttpResponse('登陆失败') return obj return render(request, 'login.html') def logout(request): obj=HttpResponse('注销成功') obj.delete_cookie('is_login') return obj @login_auth def shopping(request): return render(request, 'shopping.html', locals()) @login_auth def order(request): return render(request, 'order.html', locals()) from django.utils.decorators import method_decorator from django.views import View # @method_decorator(login_auth,name='post') #可以加在这,只给post加 # @method_decorator(login_auth,name='get') #可以加在这,只给get加 class MyOrder(View): @method_decorator(login_auth) #可以加在这,两个都加 def dispatch(self, request, *args, **kwargs): ret=super().dispatch(request, *args, **kwargs) return ret # 在cbv上加装饰器,需要用method_decorator修饰一下,因为这里第一个参数不一样 # 不能只能用装饰器,method_decorator也是一个装饰器,修饰装饰器 # @method_decorator(login_auth) #可以加在这,只给get加 def get(self,request): return HttpResponse('get') # @method_decorator(login_auth) #可以加在这,只给post加 def post(self,request): return HttpResponse('post') ''' 1 导入from django.utils.decorators import method_decorator 2 加载get,post,dispatch方法上:@method_decorator(login_auth) 3 加在类上:@method_decorator(login_auth,name='get') ''' def session_test(request): request.session['username']='lqz' request.session['is_login']=True ''' 1 生成一个随机字符串 2 把随机字符串以cookie的形式写回给浏览器 3 会在数据库里存{'随机字符串':{'username':'lqz','is_login':True}} ''' return HttpResponse('ok') def get_session(request): name=request.session['username'] is_login=request.session['is_login'] print(name) print(is_login) # request.session['k1'] # request.session.get('k1', None) # request.session['k1'] = 123 # request.session.setdefault('username', 123) # 存在则不设置 # del request.session['k1'] # print(request.session.session_key) # 将所有Session失效日期小于当前日期的数据删除 # request.session.clear_expired() # print(request.session.exists("uhsvmv7wc41pneeee6f4w0fxvqy6qzh5m29")) # 会删除数据库的session # request.session.delete() # 删除当前的会话数据并删除会话的Cookie。 # 通常用它 request.session.flush() return HttpResponse('ok') def test(request): return HttpResponse('ok')
1 向浏览器写cookie:
2.0 登录之后才能访问订单等后续页面 利用cookie来做
登陆验证成功后,才写cookie
2.1 因为后面的页面都要验证cookie,所以用装饰器
2.2 shopping-login-shopping 回到一开始要访问的页面
2.3 退出登录,删除cookie,然后就需要重新登录了
2.4 CBV中使用装饰器,装饰器可以加在4个地方
Django中操作Cookie
3.1 cookie加盐和取值
3.2 max_age 封装了expires 设置cookie过期时间
3.3 expires 设置过期时间 20:45 的形式 一般用max_age即可
3.4 Path cookie生效的路径,只有请求shopping的时候,cookie才带过去,意味着其他需要验证cookie的页面都不能通过
3.5 Domain 设置生效域名,默认是none 全域名都有效
3.6 secure=False 只有https协议才传cookie
3.7 httponly=False 只有http协议才传cookie 客户端传到服务端
Session
安全:就算知道随机字符串,但是不知道key里存的东西
赋值,取值,删除
1 设置
Session数据存在数据库中
cookie:xx=xx;sessionid=xxxx
2 取值
3 删除
# 删除数据库的session 浏览器里的session不会删除
# request.session.delete()
# 服务端和浏览器都删除
# 通常用它
# request.session.flush()
settings设置全局配置session
cookie和session重点:存,取,删。