<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      django restframework框架三 權限

      @(python之路)[django restframework框架二 權限]
      django restframework框架二 權限

      權限組件

      我們一般將權限級別放到數據庫中,這樣也方便管理。
      app01.urls.py

      from django.conf.urls import url
      from app01 import views
      urlpatterns = [
          url(r'salary/$', views.SalaryView.as_view()),
      ]
      

      model.py

      from django.db import models
      class UserInfo(models.Model):
          username = models.CharField(max_length=32)
          password = models.CharField(max_length=64)
          user_type_choices = (
              (1,"員工"),
              (2,"主管"),
          )
          user_type = models.IntegerField(choices=user_type_choices,default=1)
      

      我們寫兩個視圖,如果權限大于0,就允許訪問;
      如果權限大于一在可以訪問這個視圖;

      from rest_framework.views import APIView
      from django.shortcuts import render,HttpResponse
      from django.http import JsonResponse
      
      class MyPermission(object):
          def has_permission(self,request,view):
              return True
      
      class SalaryView(APIView):
          permission_classes = [MyPermission,]
          def get(self,request,*args,**kwargs):
              self.dispatch
              return HttpResponse("get from SalaryView")
      # usertype>1
      class UserView(APIView):
          permission_classes = [MyPermission,]
          def get(self,request,*args,**kwargs):
              return HttpResponse("get from UserView")
      

      因為我們的 def has_permission(self,request,view):返回的時True。都有查看權限。如果返回的False的話,那么所有人都不能訪問。
      我們可以在has_permission中拿到用戶相關的權限.
      根據用戶權限,具體做判斷,根據權限不同,做不同的操作。

      from rest_framework.permissions import BasePermission
      class UserPermission(BasePermission):
          def has_permission(self,request,view):
              user_type_id = request.auth.user.user_type
              if user_type_id > 0:
                  return True
              return False
      
      class ManagerPermission(BasePermission):
          def has_permission(self,request,view):
              user_type_id = request.auth.user.user_type
              if user_type_id > 1:
                  return True
              return False
      

      ?一般我們的權限都是單獨寫出來的,一些基礎的權限會放在全局。單獨放一個文件就好。記得下視圖使用的時候要導入的。
      補充:我們把要加權限的類寫法如下

      class UserView(APIView):
      
          permission_classes = [UserPermission,]
          def get(self,request,*args,**kwargs):
              self.dispatch
              print(request.user)
              print(request.auth)
              return HttpResponse('user.get')
          def post(self,request,*args,**kwargs):
              return HttpResponse('user.post')
      class SalaryView(APIView):
          permission_classes = [UserPermission,ManagerPermission, ]
          def get(self,request,*args,**kwargs):
              return HttpResponse('...')
      

      源碼分析

      ?我們還是從def dispatch()中的self.initial(request, *args, **kwargs)中入手
      1

      def initial(self, 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
      
          # 版本處理
          version, scheme = self.determine_version(request, *args, **kwargs)
          request.version, request.versioning_scheme = version, scheme
          # 處理認證
          self.perform_authentication(request)
          # 這里就是權限
          self.check_permissions(request)
          self.check_throttles(request)
      

      2
      ?我們看一下self.check_permissions(request)做了什么;

      def check_permissions(self, request):
      	# 循環每一個權限類實例化之后對象[per1,per2]
         for permission in self.get_permissions():
             # 當permission=False的時候,才會執行代碼中的
             if not permission.has_permission(request, self):
                 self.permission_denied(
                     request, message=getattr(permission, 'message', None)
                 )
      
      
      

      這里我么研究一下permission_denied

      def permission_denied(self, request, message=None):
          if request.authenticators and not request.successful_authenticator:
              raise exceptions.NotAuthenticated()
          raise exceptions.PermissionDenied(detail=message)
      
      

      拋出異常,所以我們確定當permission=False時沒有權限的,反之有權限;

      3
      ?注意:self.get_permissions()

      def get_permissions(self):
          return [permission() for permission in self.permission_classes]
      

      ?有種似曾相識的感覺。

      class APIView(View):
      
          renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES
          parser_classes = api_settings.DEFAULT_PARSER_CLASSES
          authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES
          throttle_classes = api_settings.DEFAULT_THROTTLE_CLASSES
          
          permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES
          
          content_negotiation_class = api_settings.DEFAULT_CONTENT_NEGOTIATION_CLASS
          metadata_class = api_settings.DEFAULT_METADATA_CLASS
          versioning_class = api_settings.DEFAULT_VERSIONING_CLASS
      

      permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES原理都是一樣的。

      posted @ 2018-06-01 17:22  zz小公子  閱讀(179)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产一区二区三区18禁| 国产午夜成人久久无码一区二区| 精品久久久久久国产| 欧美xxxxhd高清| 久久九九兔免费精品6| 蜜臀一区二区三区精品免费| 2020国产欧洲精品网站| 国产一卡2卡三卡4卡免费网站| AV人摸人人人澡人人超碰| 国产乱妇乱子在线视频| 美欧日韩一区二区三区视频| 亚洲熟妇自偷自拍另类| 色欲国产精品一区成人精品| 日韩高清砖码一二区在线| 欧洲女人牲交性开放视频 | 久久国产乱子精品免费女| 亚洲永久一区二区三区在线 | 人妻系列无码专区69影院| 实拍女处破www免费看| 亚洲国产精品久久久久秋霞| 久久国产精品精品国产色| 黄色免费在线网址| 国产在线观看播放av| 日本亚洲欧洲无免费码在线| 国产精品欧美福利久久| 日韩av在线不卡一区二区三区| 欧美不卡无线在线一二三区观| 自拍偷自拍亚洲精品熟妇人| 亚洲国产在一区二区三区 | 欧美高清freexxxx性| 一区二区福利在线视频| 狠狠色丁香婷婷综合尤物| 爱性久久久久久久久| 韩国无码av片在线观看| 久久99精品久久久久久9| 国产精品无码无卡在线播放| 午夜激情福利在线免费看| 国产福利片一区二区三区| 久久综合久色欧美综合狠狠| 精品无码久久久久久久久久| 人妻精品久久无码专区精东影业|