一: Cookie
1. Cookie是什么?存储在客户端浏览器上的键值对
2. 原理: 是服务器产生,发给客户端浏览器,浏览器保存起来,下次发请求,会携带这个键值对到服务器
4. Cookie的覆盖: 先写了一个键值对,后来再写,会把原来的值覆盖掉
5. cookie使用(**********************)
1) 写cookie:在Httpresponse这个对象上写 obj.set_cookie(key,value)
2) 取cookie:从request对象中取,取出来是个字典request.COOKIES
3) 删除cookie: obj.delete_cookie('name')
urlpatterns = [ url(r'^admin/', admin.site.urls), # url(r'^login/', views.login), # url(r'^order/', views.order), url(r'^shopping/', views.shopping), url(r'^salt_cookie/', views.salt_cookie), # 盐饼干 url(r'^get_cookie/', views.get_cookie), # 获取饼干 url(r'^delete_cookie/', views.delete_cookie), # 删除饼干 ]
6. cookie的其他属性
-加盐cooke
# set_signed_cookie 本质是set_cookie,只不过是在set_cookie的基础上又做了一个处理 # 必须加一个参数salt,这就是加盐,他保证了数据的安全 object.set_signed_cookie('name', 'lqz', salt='123')
-超时时间max_age,传一个秒的时间
# 10秒之后失效 (60*60*24*3)三天失效 object.set_cookie('name', 'prince', max_age=10)
-超时时间expires,传一个datatime对象
-path='/',可以设置路径,设置路径之后,path='/index/',只有访问index的时候,才会携带cookie过来
-domain 设置域名下有效domain='map.baidu.com'
-secure=False, (默认是false,设置成True浏览器将通过HTTPS来回传cookie)
-httponly=True 只能https协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
关于 next 登录认证的新写法:
# 旧的login def login(request): if request.method == 'GET': return render(request, 'login.html') else: name = request.POST('name') pwd = request.POST('pwd') if name == 'zzd' and pwd == '123': obj = HttpResponse('登陆成功') obj.set_cookie('is_login', True) return obj def order(request): is_login = request.COOKIES.get('is_login') if is_login: return HttpResponse('我是订单页面,要先登录才能看我') else: return redirect('/login/') # # def shopping(request): is_login = request.COOKIES.get('is_login') if is_login: return HttpResponse('我是购物车,得登录才能看我') else: return redirect('/login/')
# 新版login # 登录认证装饰器 def login_auth(func): def inner(request, *args, **kwargs): url = request.get_full_path() is_login = request.COOKIES.get('is_login') if is_login: res = func(request, *args, **kwargs) return res else: return redirect('/login/?next=%s' % url) return inner def login(request): if request.method == 'GET': return render(request, 'login.html') else: next = request.GET.get('next') name = request.POST.get('name') pwd = request.POST.get('pwd') if name == 'zzd' and pwd == '123': if next: obj = redirect(next) else: obj = redirect('/shopping/') obj.set_cookie('is_login', True) return obj else: return HttpResponse('用户名或密码错误') @login_auth def order(request): return HttpResponse('我是订单页面,我得登录才能看') @login_auth def shopping(request): return HttpResponse('我是购物车,得登录才能看我')
关于next新写法的意思:
比如我现在需要进入订单页面, 但是需要登录, 这个时候 next 从定向就会帮你跳转到登录界面, 在你输入完正确的用户名和密码之后又帮你重新跳转回订单页面, 所以这就是取出订单页面的地址, 一旦登录成功, 从定向回到原来要访问的地址