python之Django rest_framework

來源:互聯網
上載者:User

標籤:時間   create   try   資訊   ica   sse   類的方法   lap   xxx   

 為什麼要前後端分離:

      a、因為前端它有自己架構,這樣它的效率就非常高

      b、不做前後端分離,公司如果既有用戶端,又有app這種情況下你就的寫兩遍

django restful架構好處:

      協助我們寫了好多組件比如:

      a、認證:有類,類中的方法authenticate/authenticate_header,它的傳回值有None,元組,異常。如果傳回值為None那就不管,它是匿名使用者。

      b、許可權:有類,類中的方法:has_permission

      c、節流:有類,類的方法:allow_request,在這裡allow_request來表示限制,它是通過IP來限制,

                      它的內部原理是:預設是IP,使用者來用IP,這個IP可能代理IP,IP或者是代理IP拿著要求標頭預設放到大家能夠的緩衝中                          去,每一個人的IP為p,後面的那個列表存它的方位時間,每一次請求進來擷取它的目前時間根據時間的個數來比較,在                        比較的過程中看看把不符合時間的個數來進行比較,能訪問就繼續,不能訪問就不要繼續。

      d、版本:是url和hostname,他們兩個鐘每一個都有兩個方法一個是幫你拿版本另一個是幫你反向產生url

      e、解析器:使用者發過來的請求體資料進行操作

      f、序列化:兩個功能:序列化,校正

一、分頁

分頁的三種情況:

       a、記錄當前訪問頁的資料id

       b、最多顯示120頁

       c、對頁碼進行加密

a、基於limit offset做分頁

class P1(LimitOffsetPagination):                    max_limit = 3                default_limit = 2                limit_query_param = ‘limit‘                offset_query_param = ‘offset‘                                                class IndexView(views.APIView):                def get(self,request,*args,**kwargs):                    user_list = models.UserInfo.objects.all()                    p1 = P1()                    page_user_list = p1.paginate_queryset(queryset=user_list, request=request, view=self)                    ser = IndexSerializer(instance=page_user_list, many=True)                    return Response(ser.data) # 不含上一頁和下一頁                    # return p1.get_paginated_response(ser.data) # 含上一頁和下一頁                                class IndexView(views.APIView):                def get(self,request,*args,**kwargs):                    ret = BaseResponse()                    try:                        user_list = models.UserInfo.objects.all()                        p1 = P1()                        page_user_list = p1.paginate_queryset(queryset=user_list,request=request,view=self)                        ser = IndexSerializer(instance=page_user_list,many=True)                        ret.data = ser.data                        ret.next = p1.get_next_link()                    except Exception as e:                        ret.code= 1001                        ret.error = ‘xxxx錯誤‘                    return Response(ret.__dict__)

 b. 基於頁碼的分頁

class P2(PageNumberPagination):                # 每頁顯示的資料條數                max_page_size = 5                page_size = 2                page_size_query_param = ‘size‘                # 頁碼                page_query_param = ‘page‘

c. 基於Cursor的分頁

class P3(CursorPagination):                cursor_query_param = ‘cursor‘                page_size = 2                ordering = ‘id‘
 url.py  setting.py views.py url.py 和views一個App 下的url

二、視圖

1、APIView

class IndexView(views.APIView):                    def get(self, request, *args, **kwargs):                        user_list = models.UserInfo.objects.all()                        ser = IndexSerializer(instance=user_list,many=True)                        return Response(ser.data)

2、GenericAPIview(APIView)

3、GenericViewSet(ViewSetMixin,generics.GenericAPIView)

路由修改:                    urlpatterns = [                        url(r‘^index/$‘, views.IndexView.as_view({‘get‘:‘list‘,‘post‘:‘create‘})),                        url(r‘^index/(?P<pk>\d+)$‘, views.IndexView.as_view({‘get‘:‘retrieve‘})),                    ]                                視圖修改:                                        class IndexView(viewsets.GenericViewSet):                        def list(self,request,*args,**kwargs):                             pass # 擷取列表資訊                        def retrieve(self, request, *args, **kwargs):                            pass  # 擷取單條資料                        def create(self,request, *args, **kwargs):                            pass                                                自訂:                                            增                            POST                            /users/                        刪                            DELETE                            /users/1/                        改                            PUT                            /users/1/                                                        patch                            /users/1/                        查                            GET                            /users/                             GET                            /users/1/                                                    urlpatterns = [                            url(r‘^index/$‘, views.IndexView.as_view()),                            url(r‘^index/(?P<pk>\d+)$‘, views.IndexView.as_view()),                        ]                                                    class IndexView(views.APIView):                            def get(self,request,*args,**kwargs):                                pk = kwargs.get(‘pk‘)                                if pk:                                    pass # 擷取單條資訊                                else:                                    pass # 擷取列表資訊                            def post(self,request,*args,**kwargs):                                pass                            def put(self,request,*args,**kwargs):                                pass                            def patch(self,request,*args,**kwargs):                                pass                            def delete(self,request,*args,**kwargs):                                pass

4、ModelViewSet

ModelViewSet(mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet)                                                class IndexView(ModelViewSet):

 

 setting.py url.py views url.py 和views一個APP下的路由

3. 路由

第一類:

# http://127.0.0.1:8000/api/v1/auth/url(r‘^auth/$‘, views.AuthView.as_view()),# http://127.0.0.1:8000/api/v1/auth.json # 想要讓頁面顯示json格式url(r‘^auth\.(?P<format>[a-z0-9]+)$‘, views.AuthView.as_view()),# http://127.0.0.1:8000/api/v1/auth/1/url(r‘^auth/(?P<pk>\d+)/$‘, views.AuthView.as_view()),# http://127.0.0.1:8000/api/v1/auth/1.jsonurl(r‘^auth/(?P<pk>\d+)\.(?P<format>[a-z0-9]+)$‘, views.AuthView.as_view()),class AuthView(views.APIView):def get(self,request,*args,**kwargs):return Response(‘...‘)

第二類:

url(r‘^index/$‘, views.IndexView.as_view({‘get‘:‘list‘,‘post‘:‘create‘})),url(r‘^index/\.(?P<format>[a-z0-9]+)$‘, views.IndexView.as_view({‘get‘:‘list‘,‘post‘:‘create‘})),url(r‘^index/(?P<pk>\d+)/$‘, views.IndexView.as_view({‘get‘:‘retrieve‘,‘delete‘:‘destroy‘,‘put‘:‘update‘,‘patch‘:‘partial_update‘})),url(r‘^index/(?P<pk>\d+)\.(?P<format>[a-z0-9]+)$‘, views.IndexView.as_view({‘get‘:‘retrieve‘,‘delete‘:‘destroy‘,‘put‘:‘update‘,‘patch‘:‘partial_update‘})),class IndexView(viewsets.ModelViewSet):queryset = models.UserInfo.objects.all()serializer_class = IndexSerializerpagination_class = P2

第三類:

router = DefaultRouter()router.register(‘index‘,views.IndexViewSet)urlpatterns = [url(r‘^‘, include(router.urls)),]class IndexViewSet(viewsets.ModelViewSet):queryset = models.UserInfo.objects.all()serializer_class = IndexSerializerpagination_class = P2class IndexSerializer(serializers.ModelSerializer):class Meta:model = models.UserInfofields = "__all__"


4. 渲染器
看到的頁面時什麼樣子的,返回資料。
renderer_classes = [JSONRenderer,BrowsableAPIRenderer]

python之Django rest_framework

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.