欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django-Rest-Framework 權(quán)限管理源碼淺析(小結(jié))

 更新時(shí)間:2018年11月12日 13:56:11   作者:行行出bug  
這篇文章主要介紹了Django-Rest-Framework 權(quán)限管理源碼淺析(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

在django的views中不論是用類(lèi)方式還是用裝飾器方式來(lái)使用rest框架,django_rest_frame實(shí)現(xiàn)權(quán)限管理都需要兩個(gè)東西的配合: authentication_classespermission_classes

# 方式1: 裝飾器
from rest_framework.decorators import api_view, authentication_classes, permission_classes
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.permissions import AllowAny
from rest_framework.response import Response


@api_view(["GET", ])
@permission_classes([AllowAny,])
@authentication_classes([SessionAuthentication, BasicAuthentication])
def test_example(request):
 content = {
   'user': unicode(request.user), # `django.contrib.auth.User` instance.
   'auth': unicode(request.auth), # None
  }
  return Response(content)

# ------------------------------------------------------------
# 方式2: 類(lèi)
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from rest_framework.views import APIView

class ExampleView(APIView):
 authentication_classes = (SessionAuthentication, BasicAuthentication)
 permission_classes = (AllowAny,)

 def get(self, request, format=None):
  content = {
   'user': unicode(request.user), # `django.contrib.auth.User` instance.
   'auth': unicode(request.auth), # None
  }
  return Response(content)

上面給出的是權(quán)限配置的默認(rèn)方案,寫(xiě)和不寫(xiě)沒(méi)有區(qū)別。 rest框架有自己的settings文件 ,最原始的默認(rèn)值都可以在里面找到:

說(shuō)道rest的settings文件,要覆蓋其中的默認(rèn)行為,特別是權(quán)限認(rèn)證行為,我們只需要在 項(xiàng)目settings文件

中指定你自己的類(lèi)即可:

REST_FRAMEWORK = {
 ...
 'DEFAULT_AUTHENTICATION_CLASSES': (
  'your_authentication_class_path',
 ),
 ...
}

在rest的settings文件中,獲取屬性時(shí),會(huì)優(yōu)先加載項(xiàng)目的settings文件中的設(shè)置,如果項(xiàng)目中沒(méi)有的,才加載自己的默認(rèn)設(shè)置:

初始化api_settings對(duì)象

api_settings = APISettings(None, DEFAULTS, IMPORT_STRINGS)

APISettings 類(lèi)中獲取屬性時(shí)優(yōu)先獲取項(xiàng)目的settings文件中 REST_FRAMEWORK 對(duì)象的值,沒(méi)有的再找自己的默認(rèn)值

@property
def user_settings(self):
 if not hasattr(self, '_user_settings'):
  # _user_settings默認(rèn)為加載項(xiàng)目settings文件中的REST_FRAMEWORK對(duì)象
  self._user_settings = getattr(settings, 'REST_FRAMEWORK', {})
 return self._user_settings

def __getattr__(self, attr):
 if attr not in self.defaults:
  raise AttributeError("Invalid API setting: '%s'" % attr)

 try:
  # Check if present in user settings
  # 優(yōu)先加載user_settings,即項(xiàng)目的settings文件,沒(méi)有就用默認(rèn)
  val = self.user_settings[attr]
 except KeyError:
  # Fall back to defaults
  val = self.defaults[attr]

 # Coerce import strings into classes
 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

在rest中settings中,能自動(dòng)檢測(cè) 項(xiàng)目settings 的改變,并重新加載自己的配置文件:

權(quán)限管理原理淺析

rest框架是如何使用 authentication_classespermission_classes ,并將二者配合起來(lái)進(jìn)行權(quán)限管理的呢?

使用類(lèi)方式實(shí)現(xiàn)的時(shí)候,我們都會(huì)直接或間接的使用到rest框架中的APIVIEW,在 urls.py 中使用該類(lèi)的 as_view 方法來(lái)構(gòu)建router

# views.py
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated


class ExampleAPIView(APIView):
 permission_classes = (IsAuthenticated,)
 ...
 
# -----------------------------
from django.conf.urls import url, include

from .views import ExampleAPIView

urlpatterns = [
 url(r'^example/(?P<example_id>[-\w]+)/examples/?$',
  ExampleAPIView.as_view()),
]

在我們調(diào)用 APIVIEW.as_view() 的時(shí)候,該類(lèi)會(huì)調(diào)用父類(lèi)的同名方法:

父類(lèi)的同名方法中,調(diào)用了dispatch方法:

rest 重寫(xiě) 了該方法,在該方法中對(duì)requset做了一次服務(wù)端初始化(加入驗(yàn)證信息等)處理

調(diào)用權(quán)限管理

在權(quán)限管理中會(huì)使用默認(rèn)的或是你指定的權(quán)限認(rèn)證進(jìn)行驗(yàn)證: 這里只是做驗(yàn)證并存儲(chǔ)驗(yàn)證結(jié)果 ,這里操作完后authentication_classes的作用就完成了。驗(yàn)證結(jié)果會(huì)在后面指定的 permission_classes 中使用!

def get_authenticators(self):
  """
  Instantiates and returns the list of authenticators that this view can use.
  """
  return [auth() for auth in self.authentication_classes]

通過(guò)指定的permission_classes確定是否有當(dāng)前接口的訪問(wèn)權(quán)限:

class IsAuthenticatedOrReadOnly(BasePermission):
 """
 The request is authenticated as a user, or is a read-only request.
 """

 def has_permission(self, request, view):
  return (
   request.method in SAFE_METHODS or
   request.user and
   request.user.is_authenticated
  )

最后,不管有沒(méi)有使用permission_classes來(lái)決定是否能訪問(wèn),默認(rèn)的或是你自己指定的authentication_classes都會(huì)執(zhí)行并將權(quán)限結(jié)果放在request中!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python模塊 _winreg操作注冊(cè)表

    Python模塊 _winreg操作注冊(cè)表

    通過(guò)python操作注冊(cè)表主要有兩種方式,一種是通過(guò)python的內(nèi)置模塊 _winreg,另一種方式就是 Win32 Extension For Python的win32api模塊,這里主要簡(jiǎn)單看看用內(nèi)置模塊 _winreg如何操作注冊(cè)表
    2020-02-02
  • 教你如何用python開(kāi)發(fā)一款數(shù)字推盤(pán)小游戲

    教你如何用python開(kāi)發(fā)一款數(shù)字推盤(pán)小游戲

    這篇文章主要介紹了教你如何用python開(kāi)發(fā)一款數(shù)字推盤(pán)小游戲,文中有非常詳細(xì)的代碼示例,喜對(duì)歡玩小游戲的或者正在學(xué)習(xí)python小游戲開(kāi)發(fā)的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • python實(shí)現(xiàn)三壺謎題的示例詳解

    python實(shí)現(xiàn)三壺謎題的示例詳解

    這篇文章主要介紹了python實(shí)現(xiàn)三壺謎題功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Keras 實(shí)現(xiàn)加載預(yù)訓(xùn)練模型并凍結(jié)網(wǎng)絡(luò)的層

    Keras 實(shí)現(xiàn)加載預(yù)訓(xùn)練模型并凍結(jié)網(wǎng)絡(luò)的層

    這篇文章主要介紹了Keras 實(shí)現(xiàn)加載預(yù)訓(xùn)練模型并凍結(jié)網(wǎng)絡(luò)的層,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • 深入解析Python的Tornado框架中內(nèi)置的模板引擎

    深入解析Python的Tornado框架中內(nèi)置的模板引擎

    模板引擎是Web開(kāi)發(fā)框架中負(fù)責(zé)前端展示的關(guān)鍵,這里我們就來(lái)以實(shí)例深入解析Python的Tornado框架中內(nèi)置的模板引擎,來(lái)學(xué)習(xí)如何編寫(xiě)Tonardo的模板.
    2016-07-07
  • python3.5 cv2 獲取視頻特定幀生成jpg圖片

    python3.5 cv2 獲取視頻特定幀生成jpg圖片

    這篇文章主要為大家詳細(xì)介紹了python3.5 cv2 獲取視頻特定幀生成jpg圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 利用Python將每日一句定時(shí)推送至微信的實(shí)現(xiàn)方法

    利用Python將每日一句定時(shí)推送至微信的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于利用Python將每日一句定時(shí)推送至微信的實(shí)現(xiàn)方法,文中通過(guò)示例代碼將實(shí)現(xiàn)的步驟一步步介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • PyTorch一小時(shí)掌握之神經(jīng)網(wǎng)絡(luò)氣溫預(yù)測(cè)篇

    PyTorch一小時(shí)掌握之神經(jīng)網(wǎng)絡(luò)氣溫預(yù)測(cè)篇

    這篇文章主要介紹了PyTorch一小時(shí)掌握之神經(jīng)網(wǎng)絡(luò)氣溫預(yù)測(cè)篇,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 利用python爬取軟考試題之ip自動(dòng)

    利用python爬取軟考試題之ip自動(dòng)

    最近為了考試打算抓取網(wǎng)上的軟考試題,在抓取中遇到一些問(wèn)題,下面這篇文章主要介紹的是利用python爬取軟考試題之ip自動(dòng)的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友們下面來(lái)一起看看吧。
    2017-03-03
  • Python序列之list和tuple常用方法以及注意事項(xiàng)

    Python序列之list和tuple常用方法以及注意事項(xiàng)

    這篇文章主要介紹了Python序列之list和tuple常用方法以及注意事項(xiàng),sequence(序列)是一組有順序的對(duì)象的集合,序列可以包含一個(gè)或多個(gè)元素,也可以沒(méi)有任何元素,序列有兩種:list (表) 和 tuple(元組),需要的朋友可以參考下
    2015-01-01

最新評(píng)論