cookie与session组件

简介:

会话跟踪,解决保持状态的需求

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')
views.py

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

cookiesession重点:存,取,删。

原文地址:https://www.cnblogs.com/xujinjin18/p/9665654.html