APIVIew----》dispatch方法---》self.initial(request, *args, **kwargs)---->有認(rèn)證,權(quán)限,頻率三個版塊
在漢陽等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),成都全網(wǎng)營銷,成都外貿(mào)網(wǎng)站建設(shè),漢陽網(wǎng)站建設(shè)費(fèi)用合理。
只讀認(rèn)證源碼: self.perform_authentication(request)---》
self.perform_authentication(request)就一句話:request.user,需要去drf的Request對象中找user屬性(方法)---》
Request類中的user方法,剛開始來,沒有_user,走 self._authenticate()
核心:Request類的 _authenticate(self):
1.在需要進(jìn)行認(rèn)證的視圖類中添加(認(rèn)證類是自己寫的類,該類繼承了BaseAuthentication):
2.此時apiview里的 authentication_classes就變成了自己第一步在視圖函數(shù)類里定義的了,而不會去自己的配置文件里找
3.然后正常執(zhí)行到apiview里的dispatch方法:
4.dispatch方法內(nèi)部又調(diào)用了initialize_request方法,返回了一個新的request對象
5.authenticators這個的值是get_authenticators()方法的返回值:返回值是一個個自己定義的繼承了BaseAuthentication類的認(rèn)證類對象
6.Request類中的authenticators變成了自定義類的對象
7.在繼續(xù)走apiview里的dispatch方法里的initial方法
8.進(jìn)入認(rèn)證模塊的方法
9.進(jìn)入新封裝request對象里
10.核心_authenticate方法
def _authenticate(self):
# self是Request對象,所以去Request對象里找authenticators,
# 最后self.authenticators的結(jié)果就是一個列表,列表里面是一個個自定義認(rèn)證類的對象
for authenticator in self.authenticators:
try:
# 此時authenticator就是認(rèn)證類的對象,對象調(diào)用了authenticate方法,這個方法是需要我們在認(rèn)證類里重新寫的
# 這個方法有兩個返回值
user_auth_tuple = authenticator.authenticate(self)
except exceptions.APIException:
self._not_authenticated()
raise
if user_auth_tuple is not None:
self._authenticator = authenticator
# 這兩個返回值給了Request對象,就是request.user和request.auth(這就是為什么要求自己重新寫的authenticate方法要有兩個返回值了)
self.user, self.auth = user_auth_tuple
return
self._not_authenticated()