Cookie、Session、CBV加装饰器的三种方法

【0】cookie、session和Token的发展史

【1】Cookie的形式

  • 存储形式:k:v键值对
  • 存储位置:客户端
  • 缺点:不安全,信息可能会泄露

【2】session的形式

  • 标识符,表示我是当前用户加密出来的数据
  • 对敏感信息进行加密处理
    • 存储服务端
    • 标识符配合上你的加密串
  • 把某个数据的标识符+字符串全给服务端
    • 客户端存储格式
      • session_id:返回回来的标识符+加密串

【3】Cookie方法

【3.1】设置Cookie

python 复制代码
obj = HttpResponse('ok')

obj.set_cookie('K','V')



'''
HttpResponse:django的三板斧,返回的是字符串

.set_cookie('k','v')  -------------  设置cookie  k:key值   v:value值


设置cookie是不只是使用django三板斧中的HttpResponse,其余两个都能使用

'''

【3.2】cookie取值

python 复制代码
request.COOKIES.get('k')

【3.3】设置过期时间

python 复制代码
obj.set_cookie('k','v',expires=3)

obj.set_cookie('k','v',max_age=3)


'''
expires:设置超时时间,单位为秒

max_age:设置超时时间,单位为秒

'''

【3.4】删除cookie

python 复制代码
def logout(request,*args,**kwargs):
    
    obj = redirect('/home/')

    obj.delete_cookie('sign')
    return obj

【4】Session

【4.1】session注意事项

  • session基于数据库表才能使用
    • 必须先迁移数据库,生层django_session表
  • session只对当次登录有效
    • 主动清除浏览器中本地存在的session
    • 验签发现,没有sessionid就会生成新的session
  • django_session表中的数据取决于浏览器
  • 同一个计算机(IP地址)上同一个浏览器只会有一条数据生效
  • 同一个计算机(IP地址)上多个浏览器会有多个数据生效
  • 当session过期的时候,可能会出现多条数据对应一个浏览器
    • 但是这些数据不会持久化存储,会被定时清理掉,可以手动清除也可以代码清除
  • 目的是为了节省服务器数据库资源

【4.2】设置session

python 复制代码
request.session['sign'] = 'user'


'''
sign  --------  k值

user  --------  v值

'''

【4.3】session取值

python 复制代码
sign = request.session.get('sign')

【4.4】session设置过期时间

python 复制代码
# 设置session

request.session['key'] = 'value'

# 设置过期时间

request.session.set_expiry()



'''
参数:
    1、整数:设置多少秒过期
    2、日期:设置到指定日期失效
    3、0:退出浏览器失效
    4、不写:失效时间取决于Django内部全局session失效的时间

'''

【4.5】清空session

python 复制代码
def clear_session(request):
    request.session.delete()





'''
request.session.delete(): 只删除服务端

 
    1、该方法用于删除当前用户的Session数据,但会保留Session的Key
    2、这意味着Session对象本身仍然存在,但其中的数据将被清空
    3、下次访问时,如果Session没有被重新填充,则会得到一个空的Session对象
 
简而言之,就是使用request.session.delete()方法,会删除浏览器端的session,数据库中的数据不会被删除
    
'''
python 复制代码
def clear_session(request):
    request.session.flush()



'''
request.session.flush():服务端和客户端都删除
 
该方法用于完全删除当前用户的Session,包括Session对象和所有相关数据

下次访问时,将创建一个新的空Session对象


简而言之,就是删除了浏览器端和数据库中的session 

'''

【4.6】保存session

python 复制代码
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'   # 引擎

其他公用设置项:
SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)

【5】CBV加装饰器的三种方法

python 复制代码
from django.utils.decorators import method_decorator

# 方式二:放在类视图上面 (放的装饰器函数,name指定你的视图函数里面的方法)
# @method_decorator(login_auth, name='get')
# @method_decorator(login_auth, name='post')
class UserView(View):
    
    # 方式三 : dispactch 方法加装饰器 : 本视图函数内所有的视图都需要走装饰器
    @method_decorator(login_auth)
    def dispatch(self, request, *args, **kwargs):
        # Try to dispatch to the right method; if a method doesn't exist,
        # defer to the error handler. Also defer to the error handler if the
        # request method isn't on the approved list.
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)
    
    # 方式一:加在视图函数上面
    # @method_decorator(login_auth)
    def get(self, request, *args, **kwargs):
        return HttpResponse("这是home页面")

【5.1】补充

CSRF Token相关装饰器在CBV只能加到dispatch方法上

或者加在视图类上然后name参数指定为dispatch方法。

备注:

csrf_protect ----------无论settings.py文件中的中间件中的csrf有没有被注释掉都会报错

1、为当前函数强制设置防跨站请求伪造功能

2、即便settings中没有设置中间件

python 复制代码
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.utils.decorators import method_decorator

class HomeView(View):

     @method_decorator(csrf_exempt)
     def dispatch(self, request, *args, **kwargs):
        return super(HomeView, self).dispatch(request, *args, **kwargs)

     def get(self, request):
        return render(request, "home.html")

      def post(self, request):
        print("Home View POST method...")
        return redirect("/index/")

csrf_exempt ---------- settings.py文件中的中间件中的csrf没有注释掉也不会报错

1、取消当前函数防跨站请求伪造功能

2、即便settings中设置了全局中间件

python 复制代码
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.utils.decorators import method_decorator

@method_decorator(csrf_exempt, name='dispatch')
class HomeView(View):
    
    def dispatch(self, request, *args, **kwargs):
        return super(HomeView, self).dispatch(request, *args, **kwargs)
    
    def get(self, request):
        return render(request, "home.html")

    def post(self, request):
        print("Home View POST method...")
        return redirect("/index/")
相关推荐
zzzzzz3107 小时前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode7 小时前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220701 天前
如何搭建本地yum源(上)
运维
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
小宇宙Zz4 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工4 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智4 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_4 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化