這篇文章主要介紹了Django-Rest-Framework權(quán)限管理源碼的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
目前創(chuàng)新互聯(lián)公司已為上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管運(yùn)營(yíng)、企業(yè)網(wǎng)站設(shè)計(jì)、海東網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。在django的views中不論是用類(lèi)方式還是用裝飾器方式來(lái)使用rest框架,django_rest_frame實(shí)現(xiàn)權(quán)限管理都需要兩個(gè)東西的配合: authentication_classes
和 permission_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_classes
和 permission_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[-\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)前接口的訪(fǎ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)決定是否能訪(fǎng)問(wèn),默認(rèn)的或是你自己指定的authentication_classes都會(huì)執(zhí)行并將權(quán)限結(jié)果放在request中!
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Django-Rest-Framework權(quán)限管理源碼的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司,關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、網(wǎng)站設(shè)計(jì)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。