欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

django中APIView里的dispatch和as_view方法分析

位置:

創(chuàng)新互聯(lián)成立與2013年,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元澄江做網(wǎng)站,已為上家服務(wù),為澄江各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108

from rest_framework.views import APIView

繼承APIView類(lèi)視圖形式的路由:

path('booksapiview/', views.BooksAPIView.as_view()),  #在這個(gè)地方應(yīng)該寫(xiě)個(gè)函數(shù)內(nèi)存地址

繼承APIView類(lèi)的視圖函數(shù):

from rest_framework.views import APIView

class BooksAPIView(APIView):
    def get(self):
        pass
    
    def post(self):
        pass

APIView源碼分析:

繼承了APIView的視圖函數(shù),最終執(zhí)行的是APIView里的as_view方法

@classmethod
def as_view(cls, **initkwargs):
    """
    Store the original class on the view function.

    This allows us to discover information about the view when we do URL
    reverse lookups.  Used for breadcrumb generation.
    """
    if isinstance(getattr(cls, 'queryset', None), models.query.QuerySet):
        def force_evaluation():
            raise RuntimeError(
                'Do not evaluate the `.queryset` attribute directly, '
                'as the result will be cached and reused between requests. '
                'Use `.all()` or call `.get_queryset()` instead.'
            )

        cls.queryset._fetch_all = force_evaluation

    # 1.調(diào)用APIView父類(lèi),也就是View類(lèi)中的as_view方法,將其返回值view在賦值給view
    view = super().as_view(**initkwargs)
    # 2.這里踐行了一切皆對(duì)象的原則,將cls這個(gè)視圖類(lèi)給了view.cls,下面哪個(gè)也是一樣
    view.cls = cls
    view.initkwargs = initkwargs

    # Note: session based authentication is explicitly CSRF validated,
    # all other authentication is CSRF exempt.
    # 3.這句話的意思就是以后所有繼承APIView的試圖函數(shù)都沒(méi)有csrf認(rèn)證了,和View類(lèi)一樣,APIview類(lèi)的as_view方法最后也返回了view
    # 只不過(guò)apiview新增了去除csrf認(rèn)證這里
    return csrf_exempt(view)

注意:上述返回的view內(nèi)存地址,需要去找dispatch方法是先去apiview里找,而不是view類(lèi)中的dispatch了

apiview里的dispatch方法分析:

def dispatch(self, request, *args, **kwargs):
    """
    `.dispatch()` is pretty much the same as Django's regular dispatch,
    but with extra hooks for startup, finalize, and exception handling.
    """
    self.args = args
    self.kwargs = kwargs
    # 這里的request是self.initialize_request這個(gè)方法返回的新的由rest_framework中的Request類(lèi)實(shí)例化產(chǎn)生的request對(duì)象
    request = self.initialize_request(request, *args, **kwargs)
    # 又把新的request對(duì)象給了視圖函數(shù)中的request,從此,視圖函數(shù)中的request就是新的request對(duì)象了
    self.request = request
    self.headers = self.default_response_headers  # deprecate?

    try:
        # 這里執(zhí)行了apiview里的initial方法,這個(gè)方法里面包含了三大認(rèn)證模塊(重要)
        self.initial(request, *args, **kwargs)

        # Get the appropriate handler method
        # 三大認(rèn)證過(guò)了之后,繼續(xù)走,這里和view里面差不多,通過(guò)反射得到對(duì)應(yīng)請(qǐng)求方式的函數(shù)地址
        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

        # 將get請(qǐng)求或者其他請(qǐng)求方式執(zhí)行之后的結(jié)果在給response模塊
        response = handler(request, *args, **kwargs)

    # 這里是三大認(rèn)證出異常的異常模塊
    except Exception as exc:
        response = self.handle_exception(exc)

    # 渲染模塊,對(duì)response這個(gè)相應(yīng)結(jié)果在進(jìn)行包裝(就是在前端看到的由rest_framework渲染出來(lái)的數(shù)據(jù)結(jié)果頁(yè)面)
    self.response = self.finalize_response(request, response, *args, **kwargs)
    # 返回該渲染模塊
    return self.response

def initial(self, request, *args, **kwargs):
    # 該方法最重要的就是下面三句代碼
    # Ensure that the incoming request is permitted
    # 這個(gè)是認(rèn)證組件
    self.perform_authentication(request)
    # 這個(gè)是權(quán)限組件
    self.check_permissions(request)
    # 這個(gè)是頻率組件
    self.check_throttles(request)

分享題目:django中APIView里的dispatch和as_view方法分析
標(biāo)題URL:http://chinadenli.net/article2/dsogcoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、企業(yè)網(wǎng)站制作網(wǎng)站策劃、企業(yè)建站網(wǎng)站建設(shè)微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)