Cookie-Session

Cookie

cookie就是保存在浏览器本地的一组组键值对

HTTP协议是无状态的,每次请求都是独立的,不受前面的请求响应情况直接影响,也不会影响后面的请求响应,对服务器来书,每次的请求都是全新的

特性:

1.服务器让浏览器进行设置的

2.保存在浏览器本地

3.浏览器下次访问时自动携带响应的cookie

作用:

1.登录校验

2.保存用户的浏览习惯

3.简单的投票

Django操作

# 设置
ret = redirect('/home/')
ret.set_cookie('is_login', '1',max_age=5)   # 普通的cookie '键','值',超时时间
ret.set_signed_cookie('is_login', '1', max_age=5,'day62')  # 加密的cookie  第四个参数加盐

# 获取
request.COOKIES['']   
request.COOKIES.get('')
request.get_signed_cookie('',salt='',default='')

# 删除
ret = redirect('/login/')
ret.delete_cookie('')

 

登录校验

from django.shortcuts import render,redirect,HttpResponse
from django.views import View

# 装饰器
def login_required(func):
    def inner(request,*args,**kwargs):
        is_login = request.COOKIES.get('is_login')    # 通过字典的键取值
        if is_login == '1':
            ret = func(request,*args,**kwargs)
        else:
            return_url = request.path_info
            ret = redirect('/login/?return_url={}'.format(return_url))    # 将当前访问的地址拼接到login地址后,登录成功后再跳转回来
        return ret
    return inner


def login(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if user == 'alex' and pwd == '123':
            return_url = request.GET.get('return_url')
            if return_url:
                ret = redirect(return_url)
            else:
                ret = redirect('/home/')
            ret.set_cookie('is_login','1')
            # ret.set_signed_cookie('is_login','1','sss')    # 加密
            return ret
        else:
            return render(request,'login.html', {'err_msg':'用户名或密码错误'})
    return render(request,'login.html')


@login_required
def home(request):
    return HttpResponse('<h1>home</h1>')


@login_required
def index(request):
    return HttpResponse('<h1>index</h1>')


def logout(request):
    ret = redirect('/login/')
    ret.delete_cookie('is_login')   # 通过字典的键删除
    return ret
示例

 

Session

保存在服务器上的一组组键值对,必须依赖于cookie

cookie保存在浏览器本地,不安全,可能被拦截或窃取

cookie本身最大支持4096字节,大小有限制

当浏览器首次访问服务器时,服务器会在自己的数据库文件中记录一组键值对,键是随机生成的,值是浏览器所提交的数据,比如账号密码等,将键返回给浏览器的cookies

保存,这样用户再访问时,通过cookies所携带的唯一id进行验证

django操作

# 获取、设置、删除Session中数据(通过字典的形式进行操作)
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123)      # 存在则不设置
del request.session['k1']

# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()

# 会话session的key
request.session.session_key

# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()    # 默认为两周

# 检查会话session的key在数据库中是否存在
request.session.exists("session_key")

# 删除当前会话的所有Session数据
request.session.delete()
  
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush() 
    这用于确保前面的会话数据不可以再次被用户的浏览器访问
    例如,django.contrib.auth.logout() 函数中就会调用它。

# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略。

 

流程解析

 

 

登录校验

# 装饰器
def login_required(func):
    def inner(request, *args, **kwargs):
         # 获取session的值
        is_login = request.session.get('is_login')
                if is_login == '1':
            ret = func(request, *args, **kwargs)
        else:
            # 获取要访问的地址  拼接到login地址后
            return_url = request.path_info
            ret = redirect('/login/?return_url={}'.format(return_url))
        return ret
    return inner

def login(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if user == 'alex' and pwd == '123':
            return_url = request.GET.get('return_url')
            if return_url:
                ret = redirect(return_url)
            else:
                ret = redirect('/home/')
            # 设置session
            request.session['is_login'] = '1'
            return ret
        else:
            return render(request,'login.html', {'err_msg':'用户名或密码错误'})
    return render(request,'login.html')


@login_required
def home(request):
    return HttpResponse('<h1>home</h1>')


@login_required
def index(request):
    return HttpResponse('<h1>index</h1>')


def logout(request):
    request.session.flush()         # 删除当前的会话数据并删除会话的Cookie
    return redirect('/login/')
示例

 

posted @ 2019-04-11 17:04  Sandy-123  阅读(294)  评论(0编辑  收藏  举报