Django -- cookie与session

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(注销功能)

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("删除了")

CBV添加装饰器

装饰器的三种添加方法

# 方式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请求')

 

posted @ 2020-06-07 22:33  zhw_sylvia  阅读(134)  评论(0编辑  收藏  举报