zoukankan      html  css  js  c++  java
  • Django中间件

    1 中间件概念

    1. 定义: 中间件是一个与Django的请求/响应处理相关的框架。这是一个轻量级的、低级的“插件”系统,用于全局改变Django的输入或输出。
    2. 本质是一个类,在请求到来和结束后会根据自己发规则在合适的时机执行中间件的响应方法.
    3. 在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件
    4. 中间件可以定义四个方法:
      • process_request(self,request)
      • process_view(self, request, callback, callback_args, callback_kwargs)
      • process_exception(self, request, exception)
      • process_response(self, request, response)

    返回值可以是None和HttpResonse对象,如果是None,则继续按照django定义的规则向下执行,如果是HttpResonse对象,则直接将该对象返回给用户。

    2 自定义中间件

    1. 创建中间件类
    1. ''' 
    2. 与mange.py在同一目录下的文件夹 lex/middleware下的auth.py文件中的Authentication类 
    3. ''' 
    4. class Authentication(object): 
    5.  
    6. def process_request(self,request): 
    7. pass 
    8. def process_view(self, request, callback, callback_args, callback_kwargs): 
    9. i =1 
    10. pass 
    11. def process_exception(self, request, exception): 
    12. pass 
    13.  
    14. def process_response(self, request, response): 
    15. return response 
    1. 注册中间件
    1. MIDDLEWARE_CLASSES = ( 
    2. 'django.contrib.sessions.middleware.SessionMiddleware'
    3. 'django.middleware.common.CommonMiddleware'
    4. 'django.middleware.csrf.CsrfViewMiddleware'
    5. 'django.contrib.auth.middleware.AuthenticationMiddleware'
    6. 'django.contrib.auth.middleware.SessionAuthenticationMiddleware'
    7. 'django.contrib.messages.middleware.MessageMiddleware'
    8. 'django.middleware.clickjacking.XFrameOptionsMiddleware'
    9. 'lex.middleware.auth.Authentication'

    2.1 process_request/process_response

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


    • 示例代码:
    1. from django.utils.deprecation import MiddlewareMixin 
    2. from django.shortcuts import HttpResponse 
    3.  
    4. class Md1(MiddlewareMixin): 
    5.  
    6. def process_request(self,request): 
    7. print("Md1请求"
    8.  
    9. def process_response(self,request,response): 
    10. print("Md1返回"
    11. return response 
    12.  
    13. class Md2(MiddlewareMixin): 
    14.  
    15. def process_request(self,request): 
    16. print("Md2请求"
    17. #return HttpResponse("Md2中断") 
    18. def process_response(self,request,response): 
    19. print("Md2返回"
    20. return response 
    21.  
    22. ''' 
    23. 结果: 
    24. Md1请求 
    25. Md2请求 
    26. view函数... 
    27. Md2返回 
    28. Md1返回 
    29.  
    30. **注意**: 
    31. 如果当请求到达请求2的时候直接不符合条件返回,即return HttpResponse("Md2中断"),程序将把请求直接发给中间件2返回,然后依次返回到请求者: 
    32. Md1请求 
    33. Md2请求 
    34. Md2返回 
    35. Md1返回 
    36. ''' 
    • 流程图(出现异常时):

    2.2 process_view

    1. process_view(self, request, callback, callback_args, callback_kwargs)  
    2. # callback 为视图函数, process_view可以用来调用视图函数 
    • 示例代码(1)
    1. from django.utils.deprecation import MiddlewareMixin 
    2. from django.shortcuts import HttpResponse 
    3.  
    4. class Md1(MiddlewareMixin): 
    5.  
    6. def process_request(self,request): 
    7. print("Md1请求"
    8. #return HttpResponse("Md1中断") 
    9. def process_response(self,request,response): 
    10. print("Md1返回"
    11. return response 
    12.  
    13. def process_view(self, request, callback, callback_args, callback_kwargs): 
    14. print("Md1view"
    15.  
    16. class Md2(MiddlewareMixin): 
    17.  
    18. def process_request(self,request): 
    19. print("Md2请求"
    20. return HttpResponse("Md2中断"
    21. def process_response(self,request,response): 
    22. print("Md2返回"
    23. return response 
    24.  
    25. def process_view(self, request, callback, callback_args, callback_kwargs): 
    26. print("Md2view"
    27.  
    28. ''' 
    29. 结果: 
    30. Md1请求 
    31. Md2请求 
    32. Md1view 
    33. Md2view 
    34. view函数... 
    35. Md2返回 
    36. Md1返回 
    37. ''' 
    • 流程图

    • 注意:

      • 当最后一个中间的process_request到达路由关系映射之后,返回到中间件1的process_view,然后依次往下,到达views函数,最后通过process_response依次返回到达用户。
      • process_view如果有返回值,会越过其他的process_view以及视图函数,但是所有的process_response都还会执行。
    • 示例代码(2)

    1. class Md1(MiddlewareMixin): 
    2.  
    3. def process_request(self,request): 
    4. print("Md1请求"
    5. #return HttpResponse("Md1中断") 
    6. def process_response(self,request,response): 
    7. print("Md1返回"
    8. return response 
    9.  
    10. def process_view(self, request, callback, callback_args, callback_kwargs): 
    11. # return HttpResponse("hello") 
    12. response=callback(request,*callback_args,**callback_kwargs) 
    13. return response 
    14.  
    15. ''' 
    16. 结果: 
    17. Md1请求 
    18. Md2请求 
    19. view函数... 
    20. Md2返回 
    21. Md1返回 
    22. ''' 

    2.3 process_exception

    • 示例代码(无异常时):
    1. class Md1(MiddlewareMixin): 
    2.  
    3. def process_request(self,request): 
    4. print("Md1请求"
    5.  
    6. def process_response(self,request,response): 
    7. print("Md1返回"
    8. return response 
    9.  
    10. def process_view(self, request, callback, callback_args, callback_kwargs): 
    11. print("md1 process_view..."
    12.  
    13. def process_exception(self): 
    14. print("md1 process_exception..."
    15.  
    16. class Md2(MiddlewareMixin): 
    17.  
    18. def process_request(self,request): 
    19. print("Md2请求"
    20.  
    21. def process_response(self,request,response): 
    22. print("Md2返回"
    23. return response 
    24. def process_view(self, request, callback, callback_args, callback_kwargs): 
    25. print("md2 process_view..."
    26.  
    27. def process_exception(self): 
    28. print("md1 process_exception..."
    29. ''' 
    30. 结果: 
    31. Md1请求 
    32. Md2请求 
    33. md1 process_view... 
    34. md2 process_view... 
    35. view函数... 
    36. Md2返回 
    37. Md1返回 
    38. ''' 
    • 示例代码(视图函数异常时):
    1. class Md1(MiddlewareMixin): 
    2.  
    3. def process_request(self,request): 
    4. print("Md1请求"
    5.  
    6. def process_response(self,request,response): 
    7. print("Md1返回"
    8. return response 
    9.  
    10. def process_view(self, request, callback, callback_args, callback_kwargs): 
    11. print("md1 process_view..."
    12.  
    13. def process_exception(self): 
    14. print("md1 process_exception..."
    15.  
    16. class Md2(MiddlewareMixin): 
    17.  
    18. def process_request(self,request): 
    19. print("Md2请求"
    20.  
    21. def process_response(self,request,response): 
    22. print("Md2返回"
    23. return response 
    24. def process_view(self, request, callback, callback_args, callback_kwargs): 
    25. print("md2 process_view..."
    26.  
    27. def process_exception(self,request,exception): 
    28. print("md2 process_exception..."
    29. return HttpResponse("error"
    30.  
    31. ''' 
    32. 结果: 
    33. Md1请求 
    34. Md2请求 
    35. md1 process_view... 
    36. md2 process_view... 
    37. view函数... 
    38. md2 process_exception... 
    39. Md2返回 
    40. Md1返回 
    41. ''' 
    • 流程图

    2. 中间件应用案例

    2.1 IP访问频率限制

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

    2.2 URL访问过滤

    • 如果用户访问的是login视图(放过)
    • 如果访问其他视图,需要检测是不是有session认证,已经有了放行,没有返回login,这样就省得在多个视图函数上写装饰器了!
  • 相关阅读:
    python修改pip源
    python if条件判断dataframe是否为空
    bowtie和bowtie2使用条件区别及用法
    bat批处理for循环嵌套
    常用的数据标准化方法
    python学习——利用循环实现分类散点图绘制
    python学习——通过命令行参数根据fasta文件中染色体id提取染色体序列
    python学习——把读取fasta文件的代码封装成函数
    python学习——把计算GC含量的代码封装成函数
    python学习——使用argparse参数解释器传递命令行参数
  • 原文地址:https://www.cnblogs.com/sama/p/9303203.html
Copyright © 2011-2022 走看看