欢迎来到氵一壶灬清酒い的博客

人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

Django--组件--cookie与session 中间件

cookie概述

什么叫cookie

Cookie是key-value结构,类似于一个python中的字典。随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。 Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!

cookie规范:

  cookie大小上限为4KB;

  一个服务器最多在客户端浏览器上保存20个cookie;

  一个浏览器最多保存300个cookie

cookie与HTTP头

cookie是通过HTTP请求在客户端和服务端传递的:

  cookie:请求头客户端发送给服务器端

  格式:cookie: a=A;b=B;c=C  .即多个cookie用分号隔开, set-cookie:响应头,服务器端发送给客户端

  一个cookie对象一个set-cookie: set-cookie:a=A Set-Cookie: b=B Set-Cookie: c=C  

cookie的覆盖

  如果服务器端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA。 

Django中的Cookie语法

设置cookie:

rep = HttpResponse(...) 或 rep = render(request, ...) 或 rep = redirect()
  
rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密盐',...) 

Django框架全面讲解 -- 中间件(MiddleWare)

 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。

在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下图。

MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
  ]

自定义中间件

中间件中一共有四个方法:

              process_request

    process_view

    process_exception

    process_response

创建中间件类

class Middle_Test(object):

    def process_request(self,request):
        pass
    def process_view(self, request, callback, callback_args, callback_kwargs):
        i =1
        pass
    def process_exception(self, request, exception):
        pass

    def process_response(self, request, response):
        return response

 

1、process_request,process_response

 当用户发起请求的时候会依次经过所有的中间件,这个时候是执行process_request,最后到达views的函数中,views函数处理后,再依次穿过中间件,这个时候是process_response,最后返回给请求者。

一张图告诉你中间件的运行流程

如果感觉上图看的不明白,结合下图试试:

图1:

####################################

图2;

 

注册中间件

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
'sparks.middleware.auth.Middle_Test', )

 

在 views.py:

def index(request):
    print("view函数...")
    return HttpResponse("OK")

 

在 Mymiddlewares.py:

from django.utils.deprecation import MiddlewareMixin
  from django.shortcuts import HttpResponse

  class Md1(MiddlewareMixin):
    def process_request(self,request):
      print("Md1请求")
      # return HttpResponse("Md1中断")
    def process_response(self,request,response):
      print("Md1返回")
      return response

  class Md2(MiddlewareMixin):
    def process_request(self,request):
      print("Md2请求")
                
    def process_response(self,request,response):
      print("Md2返回")
      return response

 

应用案例

1、做IP访问频率限制

       某些IP访问服务器的频率过高,进行拦截,比如限制每分钟不能超过20次。

2、URL访问过滤

       如果用户访问的是login视图(放过);

       如果访问其他视图,需要检测是不是有session认证,已经有了放行,没有返回login,这样就省得在多个视图函数上写装饰器了!

源码试读

作为延伸扩展内容,建议你可以尝试着读一读下面两个django自带的中间件:

'django.contrib.sessions.middleware.SessionMiddleware',

'django.contrib.auth.middleware.AuthenticationMiddleware',

 

posted on 2018-11-01 22:04  成伤大大  阅读(144)  评论(0)    收藏  举报

导航