Django cookies和session

一、cookie

1、 cookie是什么?
保存在浏览器上一组组键值对
服务器让浏览器进行保存的cookie,浏览器有权利是否进行保存,再次访问服务器的时候会携带着相应的cookie

2、什么要有cookie?
http协议是无状态,每次请求都是无关联的,没有办法保存状态。
使用cookie保存状态。

3、django的操作cookie

设置cookie

ret = HttpResponse('xxx')
ret.set_cookie(key,value,max_age=5)
ret.set_signed_cookie(key,value,max_age=5,salt='xxx')

获取cookie

request.COOKIES['is_login']
request.COOKIES.get('is_login')
request.get_signed_cookie(key,salt='xxx',default='')

删除cookie

ret.delete_cookie(key)

二、 session

1、session是什么?
保存在服务器上一组组键值对,依赖cookie

2、 为什么要用session?
cookie保存在浏览器上 不安全
cookie的长度受到限制

3、django中操作session

  • 设置session
request.session[key] =  value
request.session.setdefault(key,value)
  • 获取session
request.session[key]
request.session.get(key)
  • 删除session
del request.session[key]   ——》删除某一个键值对
request.session.delete()   ——》 删除该用户的所有的session数据,不删除cookie
request.session.flush()    ——》 删除该用户的所有的session数据,删除cookie
  • 设置超时时间
request.session.set_expiry()
  • 清除所有过期的session
request.session.clear_expired()

4、配置

# Cookie name. This can be whatever you want.
SESSION_COOKIE_NAME = 'sessionid'
# Age of cookie, in seconds (default: 2 weeks).
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
			
# Whether to save the session data on every request.
SESSION_SAVE_EVERY_REQUEST = False
# Whether a user's session cookie expires when the Web browser is closed.
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
			
SESSION_ENGINE = 'django.contrib.sessions.backends.db'

setting文件里需要有这两个配置
在这里插入图片描述

三、Cookie装饰器和登陆函数示例

1、装饰器
在装饰器里获取request里带的cookies,如果cookies不符合的话,则将请求重定向到登陆页面,使用get方式将要请求的页面带在url后面,key值为next,value值为要请求的页面。如果cookies符合的话就直接返回请求不进行处理。

def login_required(fn):
    def inner(request, *args, **kwargs):
        if not request.COOKIES.get('is_login') == '1':
            next = request.path_info
            return redirect('/login/?next={}'.format(next))

        ret = fn(request, *args, **kwargs)

        return ret

    return inner

2、登陆函数
如果请求是POST且账号密码正确,则获取next要访问的地址,如果next不存在则自定义一个访问地址,然后设置cookie的key和value,还可以设置有效期,最后重定向到next的地址。
如果请求不是POST或账号密码错误,则直接返回登陆页面。

def login(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if user == 'wangxiaoyu' and pwd == '123456':
            next = request.GET.get('next')

            if next:
                ret = redirect(next)
            else:
                ret = redirect('/index/')

            ret.set_cookie('is_login', '1', max_age=5)
            return ret

    return render(request, 'login.html')

3、登出函数,删除cookie值

def logout(request):
    ret = redirect('/login/')

    ret.delete_cookie('is_login')

    return ret

四、Session装饰器和登陆函数示例

1、装饰器

def login_required(fn):
    def inner(request, *args, **kwargs):
        if not request.session.get('is_login') == '1':
            next = request.path_info
            return redirect('/login/?next={}'.format(next))

        ret = fn(request, *args, **kwargs)

        return ret

    return inner

2、登陆函数

def login(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if user == 'wangxiaoyu' and pwd == '123456':
            next = request.GET.get('next')
            if next:
                ret = redirect(next)
            else:
                ret = redirect('/index/')

            request.session['is_login']='1'
            #设置Session和Cookie的超时时间
            #如果value值是整数,session会在这些秒数后失效
            #如果value值是0,用户关闭浏览器session就会失效
            #如果value是None,session会依赖全局session失效策略,默认超时时间是2周
            request.session.set_expiry(0)
            return ret

    return render(request, 'login.html')

3、登出函数

def logout(request):
    #request.session.delete() #删除当前会话服务器上的session

    # 删除当前会话的session并删除浏览器上会话的cookie
    #用于确保当前会话数据不可以再次被用户浏览器访问
    request.session.flush()
    ret = redirect('/login/')
    #ret.delete_cookie('is_login')  #删除指定cookie

    return ret

4、数据库
session默认使用django自带的文件数据库,用命令python manage.py migrate 创建默认的表。
在这里插入图片描述
在这里插入图片描述
浏览器会设置一个sessionid的cookies,使用这个作为session_key,到服务器中获取session_data

在这里插入图片描述

Session是服务器生成的,存储在服务器端的。
1、服务器第一次响应浏览器请求时,会生成一个sessionid,返回给浏览器;
2、浏览器再次请求时,会带上cookie中的sessionid,服务器通过查询seesionid,在数据库中查询是哪个用户,取出信息,返回给浏览器;
3、Django就通过cookie和session机制完成了自动登录。

参考:https://www.cnblogs.com/maple-shaw/articles/9502602.html
https://blog.csdn.net/real_Rickys/article/details/82831376

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值