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

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

Cookie、Session、CBV加装饰器的三种方法_第1张图片

【1】Cookie的形式

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

【2】session的形式

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

【3】Cookie方法

        【3.1】设置Cookie

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取值

request.COOKIES.get('k')

        【3.3】设置过期时间

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

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


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

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

'''

        【3.4】删除cookie

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

request.session['sign'] = 'user'


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

user  --------  v值

'''

        【4.3】session取值

sign = request.session.get('sign')

        【4.4】session设置过期时间

# 设置session

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

# 设置过期时间

request.session.set_expiry()



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

'''


        【4.5】清空session

def clear_session(request):
    request.session.delete()





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

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



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

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


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

'''

        【4.6】保存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'   # 引擎

其他公用设置项:
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加装饰器的三种方法

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中没有设置中间件

 

        

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中设置了全局中间件

 

        

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/")

你可能感兴趣的:(服务器,运维)