zoukankan      html  css  js  c++  java
  • restfulframework--权限源码流程

    定义:

    判断用户是否拥有权限,有则放行,与django的中间件没有冲突,

    只是对某个或某类用户定制专有的权限,可在中间件的基础上再加上某些判定.

    源码流程:

    1,所有函数进来首先走def dispatch函数.

    def dispatch(self, request, *args, **kwargs):
            self.kwargs = kwargs
            request = self.initialize_request(request, *args, **kwargs)  #封装request,返回Request
            self.request = request
            self.headers = self.default_response_headers  ##返回头部
            try:
                self.initial(request, *args, **kwargs)  # 在这里调用版本控制,权限控制,用户控制,还有用户限流
                # Get the appropriate handler method
                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
                response = handler(request, *args, **kwargs)
            except Exception as exc:
                response = self.handle_exception(exc)
            self.response = self.finalize_response(request, response, *args, **kwargs)
            return self.response
    def dispatch
    2,调用initial函数.
    def initial(request, *args, **kwargs)
        self.format_kwarg = self.get_format_suffix(**kwargs)
            neg = self.perform_content_negotiation(request)
            request.accepted_renderer, request.accepted_media_type = neg
    
            # Determine the API version, if versioning is in use.
            version, scheme = self.determine_version(request, *args, **kwargs) #版本控制
            request.version, request.versioning_scheme = version, scheme
    
            # Ensure that the incoming request is permitted
            self.perform_authentication(request) #用户认证
            self.check_permissions(request)     #权限验证
            self.check_throttles(request)       #访问频率控制
    def initial
    3,执行self.check_permissions(request)
    def check_permissions(self, request):
            for permission in self.get_permissions():  #实例化对象列表
                if not permission.has_permission(request, self):
                    self.permission_denied(
                        request, message=getattr(permission, 'message', None)
                    )
    def check_permissions()
    4,实例化对象列表self.get_permissions()
    def get_permissions(self):
            return [permission() for permission in self.permission_classes]
    def get_permissions(self):
    5,从self.permission_classes拿值
    class APIView(View):
        permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES
    6,执行api_settings
    api_settings = APISettings(None, DEFAULTS, IMPORT_STRINGS)

    7,实例化APISettings,并且因为api_settings.DEFAULT_PERMISSION_CLASSES,
    所以调用APISettings的__getattr__方法.
    class APISettings(object):
            def __getattr__(self, attr):
            if attr not in self.defaults:
                raise AttributeError("Invalid API setting: '%s'" % attr)
            try:
                val = self.user_settings[attr]  #user_settings在这里是None
            except KeyError:
                val = self.defaults[attr]   #user_settings没有值所以调用这里.
            if attr in self.import_strings:
                val = perform_import(val, attr)
            # Cache the result
            self._cached_attrs.add(attr)   #加到集合里,去重
            setattr(self, attr, val)       #设置
            return val                     #
    class APISettings(object):
    获取配置文件的所有信息,并返回给对象列表,等待遍历.

    8,遍历对象列表并且判断是否返回False,如果是True则没有后续.
    如果返回False则运行里面内容
    if not permission.has_permission(request, self):
                    self.permission_denied(
                        request, message=getattr(permission, 'message', None)
                    )
    if not permission.has_permission
    9,如果没有这个权限就执行里面的permission_denied,也就是报错的信息
    self.permission_denied(
                        request, message=getattr(permission, 'message', None)
                    )
    self.permission_denied
    10,这里区别报错的信息,这里的错误信息可以通过前面传message重写信息
    def permission_denied(self, request, message=None):
            #如果request.user有值
            if request.authenticators and not request.successful_authenticator:
                raise exceptions.NotAuthenticated()  #
            raise exceptions.PermissionDenied(detail=message)
    def permission_denied(self, request, message=None):
     
  • 相关阅读:
    Java8新特性Stream详细教程
    自定义注解!绝对是程序员装逼的利器!!
    如何处理重复请求/并发请求的
    C#字符处理
    mysql 索引
    mysql事件【定时器】
    JS日期,金钱处理
    Controller中使用@Value无法获取属性值
    druid连接池的配置
    mybatiste报错java.lang.ClassCastException
  • 原文地址:https://www.cnblogs.com/52forjie/p/8423216.html
Copyright © 2011-2022 走看看