標籤:時間 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