cookie
服务端保存在客户端浏览器上的信息都可以称之为cookie,它的表现形式一般都是k:v键值对(cookie就是保存在客户端浏览器上的信息)
设置
#设置 obj.set_cookie(key,value) #获取 request.COOKIES.get(key) #超时 obj.set_cookie('username', 'jason666',max_age=3,expires=3) max_age expires 两者都是设置超时时间的 并且都是以秒为单位 需要注意的是 针对IE浏览器需要使用expires 主动删除cookie(注销功能)
# 视图函数的返回值 return HttpResponse() return render() return redirect() # 操作cookie obj1 = HttpResponse() return obj1 obj2 = render() return obj2 obj3 = redirect() return obj3
例子:
def login_auth(func): def inner(request,*args,**kwargs): # print(request.path_info) # print(request.get_full_path()) # 能够获取到用户上一次想要访问的url target_url = request.get_full_path() if request.COOKIES.get('username'): return func(request,*args,**kwargs) else: return redirect('/login/?next=%s'%target_url) return inner def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if username == 'jason' and password == '123': # 获取用户上一次想要访问的url target_url = request.GET.get('next') # 这个结果可能是None if target_url: obj = redirect(target_url) else: # 保存用户登陆状态 obj = redirect('/home/') # 让浏览器记录cookie数据 obj.set_cookie('username', 'jason666') """ 浏览器不单单会帮你存 而且后面每次访问你的时候还会带着它过来 """ # 跳转到一个需要用户登陆之后才能看的页面 return obj return render(request,'login.html') @login_auth def home(request): # 获取cookie信息 判断你有没有 # if request.COOKIES.get('username') == 'jason666': # return HttpResponse("我是home页面,只有登陆的用户才能进来哟~") # # 没有登陆应该跳转到登陆页面 # return redirect('/login/') return HttpResponse("我是home页面,只有登陆的用户才能进来哟~")
session
数据是保存在服务端的并且它的表现形式一般也是k:v键值对(session就是保存在服务端上的信息)
设置
#设置 request.session['key'] = value #获取 request.session.get('key') #过期时间 request.session.set_expiry() 括号内可以放四种类型的参数 1.整数 多少秒 2.日期对象 到指定日期就失效 3.0 一旦当前浏览器窗口关闭立刻失效 4.不写 失效时间就取决于django内部全局session默认的失效时间(django默认session的过期时间是14天) #清除 request.session.delete() 只删服务端的 客户端的不删 request.session.flush() 浏览器和服务端都清空)
例子:
from functools import wraps def check_login(func): @wraps(func) def inner(request,*args,**kwargs): url = request.get_full_path() if request.session.get("name"): return func(request,*args,**kwargs) else: return redirect("/s_login/?next=%s"%url) return inner def s_login(request): if request.method == "POST": name = request.POST.get("name") pwd = request.POST.get("pwd") if name == "jason" and pwd == "123": request.session["name"] = name url = request.GET.get("next") if url: return redirect(url) else: return redirect("/logout/") return render(request,"s_login.html") @check_login def get(request): return HttpResponse(123) @check_login def logout(request): request.session.flush() return HttpResponse("删除了")
# 方式1:指名道姓(给方法添加装饰器) @method_decorator(login_auth) # 方式2:可以添加多个针对不同的方法加不同的装饰器 @method_decorator(login_auth,name='get') @method_decorator(login_auth,name='post') # 方式3:dispatch会直接作用于当前类里面的所有的方法 @method_decorator(login_auth) def dispatch(self, request, *args, **kwargs): return super().dispatch(request,*args,**kwargs)
from django.views import View from django.utils.decorators import method_decorator class MyLogin(View): def dispatch(self, request, *args, **kwargs): return super().dispatch(request,*args,**kwargs) @method_decorator(login_auth) def get(self,request): return HttpResponse("get请求") def post(self,request): return HttpResponse('post请求')