http://www.cnblogs.com/liwenzhou/p/8343243.html
一、Cookie
Cookie是什么?
就是保存在客户端浏览器上的键值对。
Cookie为什么存在?
因为HTTP请求是没有状态的,每一次请求都是独立的。
服务端控制着响应,在响应里可以让浏览器在本地保存键值对,下一次登录时可以自动携带这个值。
Cookie的应用:
1、登陆、七天免登陆。
2、记录用户的浏览习惯。
3、简单的投票限制。
Cookie是服务端设置的,浏览器可以不让服务端设置Cookie(禁用),但是就无法登陆。
Cookie默认在浏览器关闭时清楚。
(1)Cookie设置流程(以登陆为例):
1、在登陆数据提交时red = redrict(...) red.set_cookie("key","value")
2、在主页验证是否有cookie: request.COOKIES.get("...")
(2)装饰器
由于在每个页面都会用到Cookie,所以可以把验证Cookie的语句封装成装饰器来使用:
(3)验证cookie后返回之前的页面 path_info
(4)cookie的保存时间max_age
(5)删除cookie
def cookie_decoration(func): def inner(request): ": return func(request) else: present_url = request.path_info #获取当前url地址 return redirect("/login"+"/?pre="+present_url) return inner def login(request): if request.method == "POST": ": if request.GET.get("pre"): #获取上一页url地址 red = redirect(request.GET.get("pre")) else: red = redirect("/home") red.set_cookie(",max_age=30) #max_age是cookie值保存的时间,以秒为单位 return red else: return HttpResponse("error") return render(request,"login.html",locals()) @cookie_decoration def home(request): return render(request,"home.html",locals()) def logout(request): red = redirect("/login") red.delete_cookie("is_login") return red
二、session
为什么有session?
cookie有一些弊端,其存储的数据是有限制的,而且数据存储在客户端,容易被窃取,所以出现session,session没有数据大小限制,且数据存储在服务端,安全性强。
session依赖于cookie,他把随机字符串作为一个大字典的键,把数据都存储在这个大字典中,字典存储在服务端,而把这个随机字符串作为cookie的值传给客户端,所以客户端只拿到这个随机值,通过这个值去服务端取数据。
注意:session需要创建数据库信息,才能把键值对存储在数据库中,不然无法使用,记得makemigrations
def cookie_decoration(func): def inner(request): if request.session.get("is_login") == "true": return func(request) else: present_url = request.path_info #获取当前url地址 return redirect("/app02/login"+"/?pre="+present_url) return inner def login(request): if request.method == "POST": ": request.session['is_login'] = "true" if request.GET.get("pre"): #获取上一页url地址 return redirect(request.GET.get("pre")) else: return redirect("/app02/home") else: return HttpResponse("error") return render(request,"login.html",locals()) @cookie_decoration def home(request): return render(request,"home.html",locals()) def logout(request): request.session.flush() return redirect("/app02/login")