• Django中间件middleware


    中间件

        - 一个轻量级底层的插件系统,可以介入Django的请求和响应过程,修改Django的输入或输出
        - 每一个中间件组件是一个独立的python类。可以定义下面方法中的一个或多个
            __init__: 无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件
            process_request(request): 执行视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
            process_view(request, view_func, view_args, view_kwargs): 调用视图之前被调用,在每个请求上调用,返回None或HttpResponse
            process_template_response(request.reponse): 在视图刚好执行完毕之后被调用,在每个请求上调用,返回实现了render方法的响应对象
            process_response(request, response): 所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
            process_exception(request, response, exception): 当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象
        - 如果你想干预哪个环节 只需编写对应的类做处理并注册到中间件调用的配置文件中
     
     1 # RBAC中间件案例
     2 
     3 import re
     4 from django.shortcuts import redirect, HttpResponse
     5 from django.conf import settings
     6 
     7 
     8 class MiddlewareMixin(object):
     9     def __init__(self, get_response=None):
    10         self.get_response = get_response
    11         super(MiddlewareMixin, self).__init__()
    12 
    13     def __call__(self, request):
    14         response = None
    15         if hasattr(self, 'process_request'):
    16             response = self.process_request(request)
    17         if not response:
    18             response = self.get_response(request)
    19         if hasattr(self, 'process_response'):
    20             response = self.process_response(request, response)
    21         return response
    22 
    23 
    24 class LoginMiddleware(MiddlewareMixin):
    25 
    26     def process_request(self, request):
    27         # login页面放行
    28         if request.path_info == '/stark11/login/':
    29             return None
    30         # 已经登录了放行
    31         if request.session.get('user_info'):
    32             return None
    33         # 否则返回login页面
    34         return redirect('/stark11/login/')
    35 
    36 
    37 class RbacMiddleware(MiddlewareMixin):
    38 
    39     def process_request(self, request):
    40         # 1. 获取当前请求的URL
    41         # request.path_info
    42         # 2. 获取Session中保存当前用户的权限
    43         # request.session.get("permission_url_list')
    44         current_url = request.path_info
    45 
    46         # 当前请求不需要执行权限验证
    47         for url in settings.VALID_URL:
    48             if re.match(url, current_url):
    49                 return None
    50 
    51         permission_dict = request.session.get(settings.PERMISSION_URL_DICT_KEY)
    52         if not permission_dict:
    53             return redirect('/stark11/login/')
    54 
    55         flag = False
    56         for group_id, code_url in permission_dict.items():
    57 
    58             for db_url in code_url['urls']:
    59                 regax = "^{0}$".format(db_url)
    60                 if re.match(regax, current_url):
    61                     request.permission_code_list = code_url['codes']
    62                     flag = True
    63                     break
    64             if flag:
    65                 break
    66 
    67         if not flag:
    68             return HttpResponse('无权访问')
  • 相关阅读:
    leetcode 268. Missing Number
    leetcode 189. Rotate Array
    leetcode 118. Pascal's Triangle 、119. Pascal's Triangle II 、120. Triangle
    HDU高精度总结(java大数类)
    一起talk C栗子吧(第八十七回:C语言实例--使用管道进行进程间通信概述)
    iOS敏捷开发之道,经常使用的宏定义总结
    360 网络攻防 hackgame 解题报告(通关)
    打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
    数列求和
    指尖上的电商---(11)Windows平台部署SolrCloud
  • 原文地址:https://www.cnblogs.com/eric_yi/p/8184060.html
Copyright © 2020-2023  润新知