django ——cookie与session

django ——cookie与session

cookie与session

cookie与session简介

cookie与session是类似于装饰器,对路由进行操作管理,所以需要先了解HTTP协议

  • HTTP协议四大特性

    ①基于请求响应

    ②基于TCP、IP作用于应用层之上的协议

    ③无状态

    ④无连接

    • 什么是无状态

      无状态就是服务端无法识别客户端的状态

    • 无状态的发展历程

      起初所有人访问网址都是一样的数据,服务端无法识别客户端

      随着互联网的发展,服务端不得不想办法记住客户端的状态,于是诞生了cookie和session用来绑定每个用户,记录每个用户的状态

  • cookie简介

    ​ 保存在客户端上跟用户信息(状态)相关的数据

    cookie的原理:

    ​ 由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断具体是哪个用户了。

  • session简介

    ​ 保存在服务端上跟用户信息(状态)相关的数据

    session的原理:
    session是基于cookie而来的,等于是将cookie所绑定的数据进行加密,增添安全性,使其在前端和数据库看到的数据是密文的形式,从而达到双重加密的作用

注意:

1.session的工作需要依赖于cookie、就算是目前所有能够识别用户身份的网址也都需要使用cookie

2.客户端浏览器也有权拒绝保存cookie

Django中操作cookie

获取Cookie

request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
参数default 表示的是默认值
salt是后序的加盐处理
max_age是后台控制的过期时间,默认时间是14天

客户端浏览器保存cookie

视图函数返回值都是需要一个HttpResonse,我们想要操作cookie,就不能直接返回对象,而是先用变量名指代,后操作对象方法

obj = HttpResponse()
obj.操作cookie的方法
return obj

obj = render()
obj.操作cookie的方法
return obj

obj = redirect()
obj.操作cookie的方法
return obj

obj = JsonRepsonse()
obj.操作cookie的方法
return obj

基本使用

obj.set_cookie()  # 设置
obj.COOKIE.get()  # 获取

cookie的其他操作

set_cookie(key,value,salt='加密盐')  # 加密盐
# 会在value后面产生一个随机字符串eg:1ntTFz:bFkwr34ztzsHQLU1qYp

set_cookie(key,value,max_age=超时时间:默认是秒数)  # 后台控制过期时间
# expires:专门针对IE浏览器设置超时时间

# 删除Cookie
# HttpResponse对象.delete_cookie(key) 
def logout(request):
    rep = redirect("/login/")
    rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值
    return rep

实例:登录功能

1.登录设置cookie
2.多个视图函数都需要校验用户是否登录
    装饰器
3.如何记住用户登录之前想要访问的页面 用户登录成功之后自动跳转
    场景1:用户访问了其他需要登录才可以访问的页面   如何跳转>>>:想要访问的
    场景2:用户直接访问的登录页面  如何跳转>>>:网址首页

request.path  # 只能获取路由后缀
request.path_info  # 只能获取路由后缀
request.get_full_path()  # 不仅能获取路由后缀,还能获取后缀问号后面的数据

# 登录校验装饰器
def login_auth(func_name):
    def inner(request, *args, **kwargs):
        if request.COOKIES.get('name'):
            res = func_name(request, *args, **kwargs)
            return res
        else:
            # 获取路由访问的后缀
            target_path = request.path_info
            # 给路由后缀带上想要访问的网址后缀数据
            return redirect(f'/login/?next={target_path}')
    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':
            target_path = request.GET.get('next')
            if target_path:
                obj = redirect(target_path)  # 如果有值则跳转到指定页面
            else:
                obj = redirect('/home/')  # 如果没有值则跳转到首页
            obj.set_cookie('name', 'jasonNB')
            return obj
    return render(request, 'login.html')


@login_auth
def home(request):
    return HttpResponse('home页面 只有登录的用户才可以查看')


@login_auth
def index(request):
    return HttpResponse('index页面 只有登录的用户才可以查看')


@login_auth
def func(request):
    return HttpResponse('func页面 只有登录的用户才可以查看')

Django中操作session

请求来之后服务端产生随机字符串并发送给客户端保存 服务端存储随机字符串与用户信息的对应关系 之后客户端携带随机字符串 服务自动校验

针对保存 django需要一张表来处理:django_session表,即django数据库迁移命令会产生一堆默认的表,其中就有一张django_session表、里面只有三个字段(session_keysession_dataexpire_date)。

  • 设置

    request.session['key'] = value  # 可以设置多组
    
    1.django自动产生一个随机字符串返回给客户端(对name加密)
    2.往django_session表中创建数据(对jason加密)
    3.sessionid:随机字符串
    
  • 获取

    request.session.get('key')  # 可以获取多组
    
    1.自动从请求中获取sessionid对应的随机字符串
    2.拿着随机字符串去django__session表中匹配数据
    3.如果匹配上还会自动解密数据并展示
    
  • 注意事项

    1.django默认的session失效时间是14天

    2.客户端会接受到键值对,键默认是sessionid值是加密的随机字符串

  • session其他操作

    request.session.session_key  # 获取产生的随机字符串
    request.session.delete()  # 只删客户端
    request.session.flush()  # 服务端和客户端都删
    request.session.set_expiry(value)  # 设置超时时间
    

    1.如果value是个整数,session会在些秒数后失效

    2.如果value是个datatime或timedelta,session就会在这个时间后失效

    3.如果value是0,用户关闭浏览器session就会失效

    4.如果value是None,session会依赖全局session失效策略

  • 针对session数据的存储位置,有五种方案

    1. 数据库Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
    
    2. 缓存Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
    
    3. 文件Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None         # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 
    
    4. 缓存+数据库
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
    
    5. 加密Cookie Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
    
posted @   Nirvana*  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示