最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
DjangoREST_framework框架03-創(chuàng)新互聯(lián)

權(quán)限組件

源碼

權(quán)限組件的源碼執(zhí)行過(guò)程和之前的認(rèn)證組件是相同的,如下:

網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)的開(kāi)發(fā),更需要了解用戶(hù),從用戶(hù)角度來(lái)建設(shè)網(wǎng)站,獲得較好的用戶(hù)體驗(yàn)。成都創(chuàng)新互聯(lián)公司多年互聯(lián)網(wǎng)經(jīng)驗(yàn),見(jiàn)的多,溝通容易、能幫助客戶(hù)提出的運(yùn)營(yíng)建議。作為成都一家網(wǎng)絡(luò)公司,打造的就是網(wǎng)站建設(shè)產(chǎn)品直銷(xiāo)的概念。選擇成都創(chuàng)新互聯(lián)公司,不只是建站,我們把建站作為產(chǎn)品,不斷的更新、完善,讓每位來(lái)訪用戶(hù)感受到浩方產(chǎn)品的價(jià)值服務(wù)。
self.check_permissions(request)
def check_permissions(self, request):
    """
    Check if the request should be permitted.
    Raises an appropriate exception if the request is not permitted.
    """
    for permission in self.get_permissions():
        if not permission.has_permission(request, self):
            self.permission_denied(
                request, message=getattr(permission, 'message', None)
            )

思考:如果要做權(quán)限認(rèn)證,我們首先要知道當(dāng)前登錄的用戶(hù)是誰(shuí),那么我們?nèi)绾沃滥兀?br/>首先rest_framework中的三個(gè)組件是按順序執(zhí)行的:

#認(rèn)證組件
self.perform_authentication(request)
#權(quán)限組件
self.check_permissions(request)
#頻率組件
self.check_throttles(request)

在第一個(gè)執(zhí)行的認(rèn)證組件源碼中有這樣一段代碼

self.user, self.auth = user_auth_tuple

這個(gè)user_auth_tuple恰巧就是我們自定義認(rèn)證視圖時(shí)返回的那個(gè)元祖

class TokenAuth(BaseAuthentication):
def authenticate(self, request):
......
return token_obj.user, token_obj.token #需要返回一個(gè)元組

因此此時(shí)的self.user=token_obj.user,self.auth=token_obj.token

局部視圖權(quán)限

在app01.service.permissions.py中:

from rest_framework.permissions import BasePermission
class SVIPPermission(BasePermission):
    message = "SVIP才能訪問(wèn)" #沒(méi)通過(guò)驗(yàn)證則返回錯(cuò)誤
    def has_permission(self, request, view): #固定寫(xiě)法
        if request.user.user_type == 3:
            return True
        return False

在views.py:

class AuthorView(viewsets.ModelViewSet):
    authentication_classes = [TokenAuth,]
    permission_classes = [SVIPPermission,]
    queryset = Author.objects.all()
    serializer_class = AuthorModelSerializers

全局視圖權(quán)限

REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
    "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",]
}

throttle(訪問(wèn)頻率)組件

源碼

self.check_throttles(request)
def check_throttles(self, request):
    """
    Check if request should be throttled.
    Raises an appropriate exception if the request is throttled.
    """
    for throttle in self.get_throttles():
        if not throttle.allow_request(request, self):
            self.throttled(request, throttle.wait())

局部視圖throttle

在app01.service.throttles.py中:

from rest_framework.throttling import BaseThrottle

class VisitThrottle(BaseThrottle):
    def allow_request(self,request,view):
        if 1:
            return True
        return False

在views.py中:

from app01.service.throttles import *

class BookViewSet(generics.ListCreateAPIView):
    throttle_classes = [VisitThrottle,]
    queryset = Book.objects.all()
    serializer_class = BookSerializers

全局視圖throttle

REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
    "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",],
    "DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",]
}

內(nèi)置throttle類(lèi)

https://www.cnblogs.com/yuanchenqi/articles/8719520.html#_label3

解析器

解析器是將接收到的數(shù)據(jù)轉(zhuǎn)換為我們所需要的數(shù)據(jù)類(lèi)型,是反序列化的過(guò)程,例如將前端傳過(guò)來(lái)的JSON解析為字典,rest_framework可以直接從request.data中取出反序列化后的JSON數(shù)據(jù),依賴(lài)的就是解析器

局部視圖

from rest_framework.parsers import JSONParser,FormParser
class PublishViewSet(generics.ListCreateAPIView):
    parser_classes = [FormParser,JSONParser] #只寫(xiě)了兩種解析器,默認(rèn)有三種
    queryset = Publish.objects.all()
    serializer_class = PublshSerializers
    def post(self, request, *args, **kwargs):
        print("request.data",request.data)
        return self.create(request, *args, **kwargs)

全局視圖

REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
    "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",],
    "DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",],
    "DEFAULT_THROTTLE_RATES":{
        "visit_rate":"5/m",
    },
    "DEFAULT_PARSER_CLASSES":['rest_framework.parsers.FormParser',]
}

如果我們自己不設(shè)置parser_classes那么就會(huì)去父類(lèi)中找

parser_classes = api_settings.DEFAULT_PARSER_CLASSES

而父類(lèi)中的默認(rèn)設(shè)置已經(jīng)包含了常用的三種解析,包括解析JSON數(shù)據(jù)和urlencoded數(shù)據(jù)等,因此這里不太需要修改

'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser'
),

思考:在實(shí)際開(kāi)發(fā)過(guò)程中,如果我們需要解析一個(gè)特殊的數(shù)據(jù)類(lèi)型,那么可以自己寫(xiě)一個(gè)解析器(類(lèi)),然后加到parser_classes = []中,這樣就可以在request.data中直接取出這種特殊數(shù)據(jù)類(lèi)型反序列化后的結(jié)果了

URLs-路由控制補(bǔ)充知識(shí)

進(jìn)一步封裝url

原有url

我們知道下面兩條url都針對(duì)一個(gè)視圖類(lèi),但每個(gè)表這寫(xiě)兩條url的話就會(huì)造成代碼重復(fù),因?yàn)椴煌淼拿織lurl只有視圖類(lèi)的名字和反向解析的名字有區(qū)別而已,這里可以進(jìn)一步封裝

url(r'^authors/$', views.AuthorView.as_view({"get": "list", "post": "create"}), name="author"),
url(r'^authors/(?P\d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="detailauthor"),
class AuthorView(viewsets.ModelViewSet):

    queryset = Author.objects.all()
    serializer_class = AuthorModelSerializers

新url

from rest_framework import routers
from django.conf.urls import include
from app01 import views

router = routers.DefaultRouter()  #實(shí)例化一個(gè)對(duì)象
router.register(r'authors', views.AuthorView)  #注冊(cè),前面寫(xiě)表名,后面寫(xiě)視圖類(lèi)的名字

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url('', include(router.urls)),
]

再訪問(wèn)就會(huì)自動(dòng)生成四條url

^authors/$ [name='author-list']
^authors\.(?P[a-z0-9]+)/?$ [name='author-list']
^authors/(?P[^/.]+)/$ [name='author-detail']
^authors/(?P[^/.]+)\.(?P[a-z0-9]+)/?$ [name='author-detail']

分頁(yè)組件

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination

分頁(yè)器A-簡(jiǎn)單分頁(yè)

class PNPagination(PageNumberPagination):
    page_size = 2 #默認(rèn)每頁(yè)顯示幾條
    page_query_param = 'page' #url上get請(qǐng)求時(shí)的關(guān)鍵字,表示第幾頁(yè) ?page=2

    page_size_query_param = 'size' #url關(guān)鍵字,臨時(shí)設(shè)置每頁(yè)顯示幾條,與默認(rèn)區(qū)分 ?size=2
    max_page_size = 3 #用于限制page_size_query_param的大值,即每頁(yè)顯示條數(shù)最多不能超過(guò)這個(gè)限制

分頁(yè)器B-偏移分頁(yè)

class MyLimitOffsetPagination(LimitOffsetPagination):
    default_limit = 3 #默認(rèn)顯示幾條數(shù)據(jù)
    limit_query_param = 'limit' #url關(guān)鍵字,臨時(shí)設(shè)置每頁(yè)顯示幾條數(shù)據(jù)
    offset_query_param = 'offset' #url關(guān)鍵字,偏移,默認(rèn)從0開(kāi)始,與limit可以配合

viewsA:

class BookView(APIView):

    def get(self, request):
        book_list = Book.objects.all()
        # 分頁(yè)
        pnp = MyLimitOffsetPagination()
        pager_books = pnp.paginate_queryset(book_list, request, self)

        ret = BookModelSerializers(pager_books, many=True, context={'request': request})

        # 此處的Response來(lái)自rest_framework
        return Response(ret.data)

viewsB:

class AuthorView(viewsets.ModelViewSet):

    queryset = Author.objects.all()
    serializer_class = AuthorModelSerializers
    pagination_class = MyLimitOffsetPagination #定義分頁(yè)器類(lèi)
返回值
{
    "count": 4, #數(shù)據(jù)總數(shù)
    "next": "http://127.0.0.1:8000/authors/?page=2", #下一頁(yè)的url
    "previous": null,
......
}

偏移分頁(yè)示例

每頁(yè)顯示一條數(shù)據(jù)的同時(shí),從第一條數(shù)據(jù)開(kāi)始向右偏移兩條數(shù)據(jù),顯示結(jié)果是第三條數(shù)據(jù)
http://127.0.0.1:8000/books/?limit=1&offset=2
每頁(yè)顯示兩條數(shù)據(jù)的同時(shí),從第一條數(shù)據(jù)開(kāi)始向右偏移兩條數(shù)據(jù),顯示結(jié)果是第三第四條數(shù)據(jù)
http://127.0.0.1:8000/books/?limit=2&offset=2

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(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)景需求。


分享題目:DjangoREST_framework框架03-創(chuàng)新互聯(lián)
轉(zhuǎn)載來(lái)源:http://fisionsoft.com.cn/article/djeies.html