<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Loading

      Django--restframework

      Django--restframework

      一 . rest framework框架的認識

      • 它是基于Django的,幫助我們快速開發符合RESTful規范的接口框架

      • 安裝 pip

      二 . 什么是RESTful風格

      三 . 基于Django實現

      urls.py

      urlpatterns = [
          path('index/', views.TestView.as_view()),  # 函數視圖
      ]
      

      views.py

      from django.forms import model_to_dict
      from django.http import HttpResponse, JsonResponse
      from django.views import View
      
      class TestView(View):
          def get(self, request):
              data = request.GET.get('name')  # View獲取前端傳遞的GET請求name參數
              return HttpResponse(data)
      
          def post(self, request):
              data = request.POST.get('username')  # View獲取前端傳遞的POST請求username參數
              return HttpResponse(data)
      
      class TestView(View):
           #基于django的序列化 for循環
          def get(self, request):
              queryset = User.objects.all()
              print(queryset)
              list = []
              for i in queryset:
                  list.append(model_to_dict(i))  # model對象轉換成dict
                  # list.append({
                  #     "name": i.name,
                  #     "age": i.age,
                  #     "home": i.home
                  # })
                  print(list)
              # In order to allow non-dict objects to be serialized set the safe parameter to False.
              # return JsonResponse(list)——》一定要加上:safe=False
              return JsonResponse(list, safe=False)
      
      

      四 . 基于Django Rest Framework框架實現

      DRF框架之視圖集APIView:http://www.rzrgm.cn/tjw-bk/p/13886536.html

      models.py

      from django.db import models
      
      # 角色表
      class Role(models.Model):
          role_name = models.CharField(max_length=32, verbose_name='角色')
      
          class Meta:
              db_table = 'tb_role'
              verbose_name = '角色'
              verbose_name_plural = verbose_name
      #用戶表
      class User(models.Model):
          name = models.CharField(max_length=12, verbose_name='姓名')
          age = models.IntegerField(verbose_name='年齡')
          home = models.CharField(max_length=255, null=True, verbose_name='家鄉')
          role = models.ManyToManyField(Role)
          class_room = models.ForeignKey(to='ClassRoom', on_delete=models.CASCADE, null=True)
      
          class Meta:
              db_table = 'tb_user'
              verbose_name = '用戶'
              verbose_name_plural = verbose_name
      
      #班級表
      class ClassRoom(models.Model):
          classroom = models.CharField(max_length=20, verbose_name='班級')
          address = models.CharField(max_length=32, verbose_name='地址')
      
          class Meta:
              db_table = 'tb_clasroom'
              verbose_name = '班級'
              verbose_name_plural = verbose_name
      
      

      urls.py

      # 子路由文件
      from django.urls import include, path
      from user import views
      from rest_framework.routers import SimpleRouter, DefaultRouter
      
      # 自動生成路由方法,必須使用視圖集
      # router=SimpleRouter() #沒有根路由 /user/無法識別 生產環境使用
      router = DefaultRouter()  # 有根路由 # 開發環境用,有主界面
      router.register(r'user2', views.UserModelViewSet)  # 配置路由
      
      urlpatterns = [
          path('user/', views.UserView.as_view()),
          path('',include(router.urls))
      ]
      
      

      自定義序列化頁面serializers.py

      from rest_framework import serializers
      from .models import *
      
      
      class UserSerializers(serializers.ModelSerializer):
          class Meta:
              model = User
              fields = "__all__"
              depth = 1  # 外鍵序列化
      

      1. 分頁

      1.1 PageNumberPagination

      前端訪問網址形式:

      GET http://192.168.56.100:8888/user/user2?page=1
      

      可以在子類中定義的屬性:

      • page_size_query_param = 'page_size' 前端發送的每頁數目關鍵字名,默認為None
      • max_page_size = 4 前端最多能設置的每頁數量
      • page_size = 2 每頁數目
      • page_query_param = 'page' 前端發送的頁數關鍵字名,默認為"page"
      1.2 可在setting配置全局分頁器
      • INSTALLED_APPS = [
            'rest_framework', #需要注冊應用
        ]
        
      • REST_FRAMEWORK = {
             # 分頁(全局):全局分頁器, 例如 省市區的數據自定義分頁器, 不需要分頁
            'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
            # 每頁返回數量
            'PAGE_SIZE': 10,  # 默認 None
        }
        
      1.3 views.py
      from rest_framework.viewsets import ModelViewSet
      from rest_framework.pagination import PageNumberPagination	#導包 
      
      #自定義分頁類
      class PageNumberPagination2(PageNumberPagination):
          page_size_query_param = 'page_size'
          max_page_size = 4
          page_size = 2
          page_query_param = 'page'
      
      '''
      手寫分頁
             def get(self, request):
                  # 手寫頁面器
                  num = request.GET.get('num', 1)
                  num = int(num)
      
                  queryset = Goods.objects.all()
                  paginator = Paginator(queryset, 1)
      
                  onepage = paginator.get_page(num)
      
                  resp = {}
                  resp['data'] = GoodsSer(onepage, many=True).data
                  resp['next_page'] = num + 1
                  resp['prev_page'] = num - 1
                  resp['page_range'] = [i for i in paginator.page_range]
                  return Response(resp)
      '''
      
      class UserModelViewSet(ModelViewSet):
          #設置查詢集
          queryset = User.objects.all()
      	#設置序列化器類
          serializer_class = UserSerializers
      	#設置分頁器
          pagination_class = PageNumberPagination2 	#使用自定義分頁器
      	#pagination_class = PageNumberPagination		 #使用全局分頁器
           
      #http://192.168.56.100:8888/user/user2?page=2
      
      1.4 使用postman測試

      2.排序

      • 對于列表數據 rest framework提供了OrderingFilter過濾器來幫助我們快速指明數據按照字段進行排序。
      2.1 在setting.py中配置全局排序
      • INSTALLED_APPS = [
            'rest_framework', #需要注冊應用
        ]
        
      • REST_FRAMEWORK = {
             #過濾排序(全局):Filtering 過濾排序
            'SEARCH_PARAM': 'search',
            'ORDERING_PARAM': 'ordering',
            'NUM_PROXIES': None,
        }
        
      2.2 使用方法:

      在類視圖中設置filter_backends,使用from rest_framework.filters import OrderingFilter過濾器,REST framework會在請求的查詢字符串參數中檢查是否包含了ordering參數,如果包含了ordering參數,則按照ordering參數指明的排序字段對數據集合進行排序。

      前端可以傳遞的ordering參數的可選字段值需要在ordering_fields中指明。

      示例:

      views.py

      from rest_framework.viewsets import ModelViewSet
      from django_filters.rest_framework import DjangoFilterBackend
      from rest_framework.filters import OrderingFilter
      
      class UserModelViewSet(ModelViewSet):
          # queryset = User.objects.all().order_by('id')
          queryset = User.objects.all()
          serializer_class = UserSerializers
          pagination_class = PageNumberPagination
      
          filter_backends = [OrderingFilter,]
          
          # 排序
          ordering_fields = ('id', 'age', 'class_room') #需要排序的字段
      
      #http://192.168.56.100:8888/user/user2?ordering=-age 使用age字段從大到小排序
      #http://192.168.56.100:8888/user/user2?ordering=age  使用age字段從小到大排序
      
      2.3 使用postman測試

      3.過濾

      對于列表數據可能需要根據字段進行過濾,我們可以通過添加django_filters擴展來增強支持。

      pip install django_filters
      
      3.1 在setting.py中配置
      • INSTALLED_APPS = [
            'django_filters',
            'rest_framework',
        ]
        
      • REST_FRAMEWORK = {
             # 過濾器后端
            'DEFAULT_FILTER_BACKENDS': [
                'django_filters.rest_framework.DjangoFilterBackend',
                # 'django_filters.rest_framework.backends.DjangoFilterBackend', 包路徑有變化
            ],
        }
        
      3.2 views.py
      from rest_framework.viewsets import ModelViewSet
      from django_filters.rest_framework import DjangoFilterBackend
      
      
      class UserModelViewSet(ModelViewSet):
          # queryset = User.objects.all().order_by('id')
          queryset = User.objects.all()
          serializer_class = UserSerializers
          pagination_class = PageNumberPagination
      
          # 過濾
          filter_backends = [OrderingFilter, DjangoFilterBackend]
          filter_fields = ('name', 'age')	#參加過濾的字段
      
      #http://192.168.56.100:8888/user/user2?name=馬六
      
      3.3 使用postman測試

      4.限流 Throttling

      可以對接口訪問的頻次進行限制,以減輕對服務器的壓力

      4.1 在setting.py中配置
      • INSTALLED_APPS = [
            'rest_framework',
        ]
        
      • REST_FRAMEWORK = {
                 # 3.限流(防爬蟲)
            'DEFAULT_THROTTLE_CLASSES': [
                'rest_framework.throttling.AnonRateThrottle',
                'rest_framework.throttling.UserRateThrottle',
            ],
            # 3.1限流策略
            'DEFAULT_THROTTLE_RATES': {
                'user': '1/hour',  # 認證用戶每小時100次
                'anon': '3/day',  # 未認證用戶每天能訪問3次
            },
            'DEFAULT_CONTENT_NEGOTIATION_CLASS': 'rest_framework.negotiation.DefaultContentNegotiation',
            'DEFAULT_METADATA_CLASS': 'rest_framework.metadata.SimpleMetadata',
            'DEFAULT_VERSIONING_CLASS': None,
        }
        

      DEFAULT_THROTTLE_RATES 可以使用 second,minute,hour或day來指明周期。

      4.2 views.py
      from rest_framework.throttling import AnonRateThrottle,UserRateThrottle
      from rest_framework.viewsets import ModelViewSet
      
      class UserModelViewSet(ModelViewSet):
          # queryset = User.objects.all().order_by('id')
          queryset = User.objects.all()
          serializer_class = UserSerializers
          
          #限流自定義限流類
          throttle_classes = [AnonRateThrottle]
           
          #超出限定的次數會報錯
      	# "detail": "Request was throttled. Expected available in 86398 seconds."
      	
          
      
      4.3 使用postman測試

      5. 序列化

      詳情看我之前的博客:http://www.rzrgm.cn/tjw-bk/p/13805532.html

      6.認證

      認證即需要知道是誰在訪問服務器,需要有一個合法身份。認證的方式可以有很多種,例如session+cookie、token等,這里以token為例。如果請求中沒有token,我們認為這是未登錄狀態,有些接口要求必須登錄才能訪問,如果未登錄,我們可以一些處理(比如重定向登錄頁、返回錯誤信息等)

      • 局部認證:

      url.py

      from django.conf.urls import url, include
      from DemoApp.views import TestView
        
      urlpatterns = [
          url(r'^test/', TestView.as_view()),
      ]
      

      功能代碼:utils/auth.py

      from rest_framework.authentication import BaseAuthentication
      from rest_framework.exceptions import AuthenticationFailed,ValidationError
      from DemoApp.models import User
      
      class MyAuth(BaseAuthentication):
          def authenticate(self, request):
              "認證邏輯"
              # 做認證,判斷是否登陸。首先拿到token,在數據庫里去判斷
              token = request.query_params.get("token","")
              if not token:
                  raise AuthenticationFailed("沒有token")
              try:
                  user = User.objects.filter(token=token).first()
                  if not user:
                      pass
                      raise AuthenticationFailed("無效的token")
              except Exception as e:
                  msg = "無效的token" if hasattr(e, "messages") else "非法的token"
                  raise AuthenticationFailed(msg)
      
              return (user, token) # 返回值是一個元素,分別對應視圖中request的user,auth
      

      views.py

      class TestView(APIView):
          authentication_classes = [MyAuth, ]  # 局部認證
      
          def get(self, request, *args, **kwargs):
              "通過認證后進入views類進行業務處理"
              print(request.user)
              print(request.auth)
              pass
      

      在上述代碼中,實現了TestView視圖類的認證功能。如果認證成功,向視圖類中的request對象中返回requset.user和request.auth;如果認證失敗,觸發異常,不會進入視圖處理,直接返回前端認證失敗的結果。在實際的業務中這樣并不合適,我們可以將其替代成重定向操作。

      • 全局認證
      • 將視圖類中的authentication_classes屬性刪除
      • settings.py配置文件中 RESTFRAMEWORK 添加配置
      6.1 在setting.py中配置
      • INSTALLED_APPS = [
            'rest_framework',
        ]
        
      • REST_FRAMEWORK = {
             # 1.認證器(全局)
            'DEFAULT_AUTHENTICATION_CLASSES': [
                'rest_framework_jwt.authentication.JSONWebTokenAuthentication',  # 在DRF中配置JWT認證
                'rest_framework.authentication.SessionAuthentication',  # 使用session時的認證器
                'rest_framework.authentication.BasicAuthentication'  # 提交表單時的認證器
            ],
        }
        

      如果在全局認證下,有些接口不想加上認證,可以在這個類的屬性 authentication_classes = [ ] 即可。

      除了上述自己實現的認證類,REST Framework為我們了四種認證類:(直接在視圖類中使用即可)

      from rest_framework.authentication import BaseAuthentication,SessionAuthentication  ......
      1.BasicAuthentication       基于用戶名密碼
      2.SessionAuthentication     基于session
      3.TokenAuthentication       基于token,與示例中類似
      4.RemoteUserAuthentication  
      
      6.2 views.py
      from rest_framework.authentication import BasicAuthentication, SessionAuthentication
      from rest_framework_jwt.authentication import JSONWebTokenAuthentication
      
      class CourseViewSet(viewsets.ModelViewSet):
          # 1.認證:自定義認證類,自定義會覆蓋全局配置
          authentication_classes = (BasicAuthentication, SessionAuthentication, JSONWebTokenAuthentication)
           
      

      7.權限

      根據不同權限用戶對于api的訪問頻次,其他限制等等

      7.1 在setting.py中配置
      • INSTALLED_APPS = [
            'rest_framework',
        ]
        
      • REST_FRAMEWORK = {
            # 2.權限配置(全局): 順序靠上的嚴格
            'DEFAULT_PERMISSION_CLASSES': [
                # 'rest_framework.permissions.IsAdminUser',  # 管理員可以訪問
                'rest_framework.permissions.IsAuthenticated',  # 認證用戶可以訪問
                # 'rest_framework.permissions.IsAuthenticatedOrReadOnly',  # 認證用戶可以訪問, 否則只能讀取
                'rest_framework.permissions.AllowAny',  # 所有用戶都可以訪問
            ],
        }
        
      7.2 views.py
      from rest_framework.permissions import AllowAny, IsAuthenticated
      
      class CourseTagViewSet(viewsets.ModelViewSet):
          queryset = CourseTag.objects.all()
          serializer_class = CourseTagSer
      
          # 2.權限:自定義權限類
          # permission_classes = (AllowAny,)
          permission_classes = (IsAuthenticated,)
          
      
      7.3 使用postman測試

      8.版本

      參考博客:https://openapi.alipay.com/gateway.do?
      https://www.jb51.net/article/166249.htm

      posted @ 2020-11-10 09:51  就學45分鐘  閱讀(385)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 91久久偷偷做嫩草影院免费看| 韩国V欧美V亚洲V日本V| 日本亚洲一区二区精品久久 | 欧美亚洲另类自拍偷在线拍| 一个色综合国产色综合| 秋霞在线观看秋| 精品一区二区免费不卡| 综合区一区二区三区狠狠| 日韩放荡少妇无码视频| 时尚| 日韩欧美在线综合网另类| 国产精品成人高潮av| 中文字幕亚洲人妻一区| 欧美黑人巨大videos精品| 亚洲av永久无码精品成人| 97人人添人人澡人人澡人人澡| 亚洲顶级裸体av片| 久久久久久久一线毛片| 一本色道婷婷久久欧美| 极品粉嫩小泬无遮挡20p| 欧美精品在线观看| 美女黄18以下禁止观看| 国产成人午夜福利精品| 麻豆一区二区三区精品视频| 免费天堂无码人妻成人av电影| 亚洲熟女国产熟女二区三区| 中文字幕乱码十国产乱码| 人妻丝袜无码专区视频网站| 国产97色在线 | 免费| 天天摸天天碰天天添| 亚洲免费福利在线视频| 亚洲午夜久久久影院伊人| 性色av 一区二区三区| a男人的天堂久久a毛片| 精品国产大片中文字幕| 丘北县| 日本深夜福利在线观看| 一本大道无码av天堂| 午夜免费视频国产在线| 久久香蕉国产亚洲av麻豆| 隔壁老王国产在线精品|