zoukankan      html  css  js  c++  java
  • 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('无权访问')
  • 相关阅读:
    如何评测软件工程知识技能水平?
    创新产品的需求分析:未来的图书会是什么样子?
    案例分析:设计模式与代码的结构特性
    业务领域建模Domain Modeling
    转载:10 Easy Steps to a Complete Understanding of SQL
    二十六个月Android学习工作总结
    android sdk无法更新问题解决
    android中利用view画出一条竖线
    android-Java SoftReference,WeakReference,Direct Reference简介
    Intellij IDEA开发第一个android应用教程
  • 原文地址:https://www.cnblogs.com/eric_yi/p/8184060.html
Copyright © 2011-2022 走看看