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

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

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

      Day 89 Django_視圖封裝 & 路由 & 版本控制組件

      視圖封裝

      model.py 文件

      from django.db import models
      
      
      # Create your models here.
      
      class Book(models.Model):
          title = models.CharField(max_length=32, verbose_name='圖書名稱')
          CHOICES = ((1, 'Java'), (2, 'MySQL'), (3, 'Python'),)
          category = models.IntegerField(choices=CHOICES, verbose_name='圖書分類')
          pub_time = models.DateField(verbose_name='出版社日期')
      
          publisher = models.ForeignKey(to='Publisher',on_delete=callable,db_constraint=False)
          author = models.ManyToManyField(to='Author')
      
          def __str__(self):
              return self.title
      
          class Meta:
              verbose_name_plural = '01_圖書表'
              db_table = verbose_name_plural
      
      
      class Publisher(models.Model):
          title = models.CharField(max_length=32,verbose_name='出版社信息')
      
          def __str__(self):
              return self.title
      
          class Meta:
              verbose_name_plural = '02_出版社表'
              db_table = verbose_name_plural
      
      
      class Author(models.Model):
          Author_name = models.CharField(max_length=32, verbose_name='作者')
      
          def __str__(self):
              return self.Author_name
      
          class Meta:
              verbose_name_plural = '03_作者表'
              db_table = verbose_name_plural
      model.py

      urls.py 文件

      from django.urls import path, include
      from .views import BookView, BookEditView, BookTwoEditView
      
      urlpatterns = [
          path('list',BookView.as_view()),
          path('EditBook/<int:id>',BookEditView.as_view())
          # path('list', BookTwoEditView.as_view({"get": "list", "post": "create"})),
          # path('EditBook/<int:id>', BookTwoEditView.as_view({"get": "retrieve", "put": "edit_View", "delete": "eidt_delete"}))
      ]
      urls.py

      serializers.py 文件

      from rest_framework import serializers
      from .models import Book
      
      class BookSerializer(serializers.ModelSerializer):
          category_display = serializers.SerializerMethodField(read_only=True)
          publisher_info = serializers.SerializerMethodField(read_only=True)
          authors = serializers.SerializerMethodField(read_only=True)
      
          def get_category_display(self, obj):
              return obj.get_category_display()
      
          # 通過自定義 get_publisher 與 get_author 來獲取我們想要的指定字段
          def get_publisher_info(self, obj):
              # obj 是我們序列化的每個 Book 對象
              publisher_obj = obj.publisher
              return {"id": publisher_obj.id, "title": publisher_obj.title}
      
          def get_authors(self, obj):
              author_obj = obj.author.all()
              return [{'id': author.id, 'Author_name': author.Author_name} for author in author_obj]
      
          class Meta:
              model = Book
              # fields = ['id','title','pub_time']  # 拿到指定信息
              fields = '__all__'  # 拿到所有信息,但存在關聯字段 id 信息,不利于閱讀,需要單獨處理
              # depth = 1   # 獲取關聯表中的字段,數字代表 深度,但這樣回取出所有數據
      
              # extra_kwargs 添加字段的屬性信息
              extra_kwargs = {"category": {"write_only": True}, "publisher": {"write_only": True},
                              "author": {"write_only": True}}
      serializers.py

      views.py 文件

      from .models import Book, Publisher
      from .serializers import BookSerializer
      from rest_framework.views import APIView
      from rest_framework.response import Response
      
      class GenericAPIView(APIView):
          query_set = None
          serializers_class = None
      
          def get_queryset(self):
              return self.query_set
      
          def get_serializer(self, *args, **kwargs):
              return self.serializers_class(*args, **kwargs)
      
      
      class GetListModelMixin(object):
          def list(self, request):
              queryset = self.get_queryset()
              ret = self.get_serializer(queryset, many=True)
              return Response(ret.data)
      
      
      class PostCreateModeMixin(object):
          def create(self, request):
              serializers = self.get_serializer(data=request.data)
              if serializers.is_valid():
                  serializers.save()
                  return Response(serializers.data)
              else:
                  return Response(serializers.errors)
      
      
      class RetrieveModeMixin(object):
          def retrieve(self, request, id):
              book_obj = self.get_queryset().filter(id=id).first()
              ret = self.get_serializer(book_obj)
              return Response(ret.data)
      
      
      class EditViewModeMixin(object):
          def edit_View(self, request, id):
              book_obj = self.get_queryset().filter(id=id).first()
              ret = self.get_serializer(book_obj, data=request.data, partial=True)  # partial 是否允許部分更新
              if ret.is_valid():
                  ret.save()
                  return Response(ret.data)
              else:
                  return Response(ret.errors)
      
      
      class EditDeleteModeMixin(object):
          def eidt_delete(self, request, id):
              book_obj = self.get_queryset().filter(id=id).first()
              book_obj.delete()
              return Response('已刪除')
      
      
      class BookViewListClass(GenericAPIView, GetListModelMixin, PostCreateModeMixin):
          pass
      
      
      class BookView(BookViewListClass):  # 繼承 GenericAPIView 這個通用類
          query_set = Book.objects.all()
          serializers_class = BookSerializer
      
          def get(self, request):
              return self.list(request)
      
          # Post 請求
          def post(self, request):
              return self.create(request)
      
      
      class BookEditListClass(GenericAPIView, RetrieveModeMixin, EditViewModeMixin, EditDeleteModeMixin):
          pass
      
      
      class BookEditView(BookEditListClass):
          query_set = Book.objects.all()
          serializers_class = BookSerializer
      
          def get(self, request, id):
              return self.retrieve(request, id)
      
          def put(self, request, id):
              return self.edit_View(request, id)
      
          def delete(self, request, id):
              return self.eidt_delete(request, id)
      views.py

       

      使用路由傳參實現用一個視圖完成該功能

      urls.py 文件,實現路由傳參 views.py 中類必須繼承 ViewSetMixin

      from django.urls import path, include
      from .views import BookView, BookEditView, BookTwoEditView
      
      urlpatterns = [
          # path('list',BookView.as_view()),
          # path('EditBook/<int:id>',BookEditView.as_view())
          path('list', BookTwoEditView.as_view({"get": "list", "post": "create"})),
          path('EditBook/<int:id>', BookTwoEditView.as_view({"get": "retrieve", "put": "edit_View", "delete": "eidt_delete"}))
      ]
      urls.py

      views.py 文件,新建類繼承 ViewSetMixin

      from rest_framework.viewsets import ViewSetMixin
      # 框架提供的類 所在包位置
      from rest_framework.viewsets import ModelViewSet # 這個是框架提供的 ManyViewClass 類
      from rest_framework import views
      from rest_framework import generics
      from rest_framework import mixins
      from rest_framework import viewsets
      
      
      class ManyViewClass(ViewSetMixin, GenericAPIView, GetListModelMixin, PostCreateModeMixin, RetrieveModeMixin,
                          EditViewModeMixin, EditDeleteModeMixin):
          pass
      
      
      class BookTwoEditView(ManyViewClass):
          query_set = Book.objects.all()
          serializers_class = BookSerializer
      views.py

       

      DRF 路由組件

      from rest_framework.routers import DefaultRouter

       

      版本控制組件介紹

      settings.py 文件,新增 REST_FRAMEWORK 參數,使用 rest_framework.versioning.QueryParameterVersioning

      REST_FRAMEWORK = {
          # "DEFAULT_VERSIONING_CLASS": "utils.version.MyVersion",
          "DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.QueryParameterVersioning",
          "DEFAULT_VERSION": "v1",
          "ALLOWED_VERSIONS": "v1, v2",
          "VERSION_PARAM": "ver"
      }
      settings.py

      urls.py 文件

      from django.urls import path,include
      from .views import DomeView
      
      urlpatterns = [
          path(r'',DomeView.as_view()),
      ]
      urls.py

      views.py 文件

      from rest_framework.views import APIView
      from rest_framework.response import Response
      
      
      class DomeView(APIView):
          def get(self,request):
              print(request.version)
              print(request.versioning_scheme)
              if request.version == 'v1':
                  return Response('V1 版本')
              if request.version == 'v2':
                  return Response('V2 版本')
              return Response('測試版本')
      views.py

       

      認證組件

      認證組件的方法都在:import rest_framework.authentication

      models.py

      from django.db import models
      
      # Create your models here.
      
      from django.db import models
      class User(models.Model):
          username = models.CharField(max_length=32)
          password = models.CharField(max_length=32)
          token = models.UUIDField()
      models.py

      urls.py

      from django.urls import path,include
      from .views import authDome,LoginDome,TestDome
      
      urlpatterns = [
          path(r'',authDome.as_view()),
          path(r'login',LoginDome.as_view()),
          path(r'test',TestDome.as_view()),
      ]
      urls.py

      views.py

      import uuid
      # Create your views here.
      
      from rest_framework.views import APIView
      from rest_framework.response import Response
      from utils.auth import MyAuth
      
      from .models import User
      
      
      class authDome(APIView):
          def get(self,request):
              return Response('認證視圖')
      
      class LoginDome(APIView):
          def post(self,request):
              username = request.data.get('username')
              password = request.data.get('password')
              token = uuid.uuid4()
              User.objects.create(username=username,password=password,token=token)
              return Response('創建成功')
      
      class TestDome(APIView):
          # 局部視圖配置 在需要做驗證的類中配置
          authentication_class = [MyAuth,]
          def get(self,request):
              print(request.user)
              print(request.auth)
              return Response('認證測試')
      views.py

      auth.py 認證文件

      from rest_framework.authentication import BaseAuthentication
      from rest_framework.exceptions import AuthenticationFailed
      from authDome.models import User
      
      
      class MyAuth(BaseAuthentication):
          def authenticate(self,request):
              token = request.query_params.get("token","")
              if not token:
                  raise AuthenticationFailed("沒有攜帶 token")
              user_obj =  User.objects.filter(token=token).first()
              if not user_obj:
                  raise AuthenticationFailed("攜帶的 token 不合法")
              return (user_obj,token)
      auth.py

       

      權限組件

      權限組件的方法都在:import rest_framework.permissions

      新建 permission.py 文件

      from rest_framework.permissions import BasePermission
      class MyPermission(BasePermission):
          message = '沒有權限'
          def has_permission(self, request, view):
              # 判斷用戶是否有權限
              user_obj = request.user
              if user_obj.type == 3:
                  return False
              else:
                  return True
      permission.py

      models.py 文件

      from django.db import models
      
      
      class User(models.Model):
          username = models.CharField(max_length=32)
          password = models.CharField(max_length=32)
          token = models.UUIDField()
          type = models.IntegerField(choices=((1, "vip"), (2, "VVIP"), (3, "普通用戶"),), default=3)
      models.py

      views.py 文件

      from django.shortcuts import render
      import uuid
      # Create your views here.
      
      from rest_framework.views import APIView
      from rest_framework.response import Response
      from utils.auth import MyAuth
      from utils.permission import MyPermission
      from .models import User
      
      
      class authDome(APIView):
          def get(self,request):
              return Response('認證視圖')
      
      class LoginDome(APIView):
          def post(self,request):
              username = request.data.get('username')
              password = request.data.get('password')
              token = uuid.uuid4()
              User.objects.create(username=username,password=password,token=token)
              return Response('創建成功')
      
      class TestDome(APIView):
          # 局部視圖配置 在需要做驗證的類中配置
          authentication_classes = [MyAuth, ]     
          permission_classes = [MyPermission, ]   # 添加權限類
          def get(self,request):
              print(request.user)
              print(request.auth)
              return Response('認證測試')
      views.py

       

      頻率接口

       

      posted @ 2023-02-10 19:50  亦雙弓  閱讀(37)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲男人的天堂久久香蕉| 97人妻熟女成人免费视频色戒| 塔河县| 国产亚洲精品久久77777| 亚洲国产精品老熟女乱码| 精品国产午夜福利在线观看| 亚洲天堂一区二区成人在线| 国产粉嫩一区二区三区av| 久久国产精品亚洲精品99| 亚洲熟女乱综合一区二区三区| 凤庆县| 么公的好大好硬好深好爽视频| 国产成人精品一区二区三区| 成熟少妇XXXXX高清视频| 99久久99这里只有免费费精品| 日韩精品国产另类专区| 色综合 图片区 小说区| 少妇高潮喷潮久久久影院| 大英县| 国产精品夫妇激情啪发布| 欧美巨大极度另类| 日本一区二区三区四区黄色| 天堂亚洲免费视频| 伊人久久大香线蕉av五月天| 久久亚洲色WWW成人男男| 性色av 一区二区三区| 国产自拍在线一区二区三区| 欧美牲交a欧美牲交aⅴ图片| 色综合视频一区二区三区| 五月婷婷中文字幕| 日韩精品成人区中文字幕| 国产精品先锋资源站先锋影院| 精品乱码一区二区三四五区| 国产成人高清亚洲综合| 久久亚洲精品情侣| 你拍自拍亚洲一区二区三区| 四虎永久精品免费视频| 免费人成在线观看成人片| 日韩一区精品视频一区二区| 亚洲色大成网站WWW久久| 最新精品国偷自产在线美女足|