首页 > 其他分享 >【DRF-12】rest-framework之路由

【DRF-12】rest-framework之路由

时间:2024-06-05 21:34:08浏览次数:13  
标签:12 views rest framework 视图 re import path 路由

  • 路由控制介绍:

    • 我们之前一直接触的路由是最基本的形式, 就是我们下面介绍的第一种方式的自定义路由, 无论是FBV还是CBV, 都可以使用这用方式来设置路由来设定请求来的时候对应响应视图的函数或者视图类
    • 当我们使用封装了的视图类处理代码的时候, 我们就可以使用对应的半自动路由来对路由进行设置, 这时我们可以在路由中传入一个字典, 在字典中使用key:value的形式来设置请求对应的视图类中的处理方法, 具体的使用见下面的半自动路由配置
    • 全自动路由配置是在路由层借助了routers来生成相应的对象来自动生成路由, 全自动路由使用的较少, 还是那句话, 本身封装的程度越高, 相应的可拓展性就越差
  • 自定义路由(原始方式)

    • 路由设置
from django.urls import path,re_path
from api import views

urlpatterns = [
    re_path(r'^(?P<version>[v1|v2]+)/books/$', views.BookView.as_view()),
    re_path(r'^(?P<version>[v1|v2]+)/book/(?P<pk>\d+)$', views.BookDetailView.as_view()),
]
  • 视图
from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.versioning import URLPathVersioning,QueryParameterVersioning

class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        fields = '__all__'

class BookView(APIView):
    # 获取所有书籍信息
    def get(self,request,*args,**kwargs):
        obj = models.Book.objects.all()
        ser = BookModelSerializer(instance=obj,many=True)
        return Response(ser.data)

    # 新增书籍信息
    def post(self, request, *args, **kwargs):
        ser = BookModelSerializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return HttpResponse("提交成功")
        else:
            return HttpResponse(ser.errors)


class BookDetailView(APIView):
    # 获取单个书籍数据
    def get(self,request,*args,**kwargs):
        pk = kwargs.get('pk')
        obj = models.Book.objects.filter(id=pk).first()
        ser = BookModelSerializer(instance=obj,many=False)
        return Response(ser.data)

    # 删除单个书籍
    def delete(self,request,*args,**kwargs):
        pk = kwargs.get('pk')
        models.Book.objects.filter(id=pk).delete()
        return Response('删除成功')

    # 更新书籍信息
    def put(self,request,*args,**kwargs):
        pk = kwargs.get('pk')
        obj = models.Book.objects.filter(id=pk).first()
        ser = BookModelSerializer(data=request.data,instance=obj)
        if ser.is_valid():
            ser.save()
            return HttpResponse("更新成功")
        else:
            return Response(ser.errors)
  • 半自动路由(视图类继承ModelViewSet)
    • 半自动路由的使用场景是比较多的, 这里继承ModelViewSet, 实际最终还是来自于ViewSetMixin, 半自动路由正式和它配合使用的
    • 半自动路由可以在路由层传入字典, 在字典中规定对应请求在是视图类中处理方法, 这样就解决了, 两个get请求需要获取不同数据的需求, 也正式这一点, 使用半自动路由的时候, 可以在视图类中可以自己自由定制对应请求在视图类中处理方法的名字, 不用再拘束于get请求要视图类中的处理方法就必须是get这样的约束.
    • 路由
from django.urls import path,re_path
from api import views

urlpatterns = [
    # re_path(r'^(?P<version>[v1|v2]+)/books/$', views.BookView.as_view()),
    # re_path(r'^(?P<version>[v1|v2]+)/book/(?P<pk>\d+)$', views.BookDetailView.as_view()),
    re_path(r'^(?P<version>[v1|v2]+)/book/$', views.BookView.as_view({'get':'list','post':'create'})),
    re_path(r'^(?P<version>[v1|v2]+)/book/(?P<pk>\d+)/$', views.BookView.as_view({'get':'retrieve','put':'update','delete':'destroy'})),
]
  • 视图
from rest_framework.viewsets import ModelViewSet

class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        fields = '__all__'

class BookView(ModelViewSet):
    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer
  • 全自动路由
    • 全自动路由在路由层由routers实例化出的对象辅助来完成自动化生成多个路由
    • 由routers对象先注册一个基本路由, 在配置过之后就会自动生成各种围绕基本路由的路由了
    • 路由
from django.conf.urls import include
from django.urls import path,re_path
from api import views
from rest_framework import routers

router = routers.DefaultRouter()
# 两个参数,一个是匹配的路由,一个是视图中写的CBV的类
router.register('book',views.BookView)

urlpatterns = [
    # re_path(r'^(?P<version>[v1|v2]+)/books/$', views.BookView.as_view()),
    # re_path(r'^(?P<version>[v1|v2]+)/book/(?P<pk>\d+)$', views.BookDetailView.as_view()),
    # re_path(r'^(?P<version>[v1|v2]+)/book/$', views.BookView.as_view({'get':'list','post':'create'})),
    # re_path(r'^(?P<version>[v1|v2]+)/book/(?P<pk>\d+)/$', views.BookView.as_view({'get':'retrieve','put':'update','delete':'destroy'})),

    re_path(r'^(?P<version>[v1|v2]+)/', include(router.urls)),
]
  • 视图
from rest_framework.viewsets import ModelViewSet

class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        fields = '__all__'

class BookView(ModelViewSet):
    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer
  • 我们输入错误的路由,可以看到book生成了对应的4个路由

标签:12,views,rest,framework,视图,re,import,path,路由
From: https://www.cnblogs.com/xwltest/p/18233858

相关文章

  • 小米10ultra(IMX350 2000W) 小米11ultra(IMX586 4800W) 超广角放大对比 ISO12233
    拍摄距离ISO12233的打印纸大概半米,室内灯光环境结论:差距比较小,不过也是能看出来的。大概差半级到一级。10u能分辨到4,11u能分辨到4.5。小米10ultra质量:高HEICIMG_20240605_205122.HEIC1.29MB3880x5184 像素  小米11ultra质量:高没用HEIC用的jpgIMG_20240605_2......
  • QOJ #1285.Stirling Number
    一道非常厉害的题目。题意求:\[\sum_{i=0}^{m}c(n,i)\modp\]其中\(c(n,i)\)为无标号第一类斯特林数,且有\(n,m\le10^{18},p\le10^6\)。Sol考虑一个性质:\[x^{\overlinep}\equivx^p-x\modp\]证明比较简单,考虑费马小定理,\(x^p\equivx\modp\)。而\(x,x+1,\cdots,x+......
  • restemplate访问对端,解析异常
    restemplate访问,解析异常的情况try{response=execute(CREATE_PROJECT,HttpMethod.POST,request);}catch(HttpClientErrorExceptione){//处理4xx服务端错误log.error("创建repository异常,repository={},groupId={}"......
  • 1123 舍入(测试点2,6,7,8)
    solution注意负号的取舍以及进位只有舍入后非零的负数才会输出负号可能有多位进位,用高精度加法测试点2,6:整数13188.000测试点7:多次进位1339.999910.000测试点8:舍入后全0的负值133-0.00000000010.000#include<iostream>#include<string>usi......
  • Android Audio模块 音量增益 framework到HAL 层加载流程
    目录背景概念AndroidAudio调用流程(app-framework-HAL)标记0libaudioclient标记1libaudioclient:aps变量赋值标记1.1binder变量赋值标记2audiopolicy标记4audiopolicy:mAudioPolicyManager变量赋值标记5audiopolicy标记6audiopolicy:mpClientInterface变量赋值标......
  • C++Primer Plus第十二章程序清单12.1~12.3一个失败的例子分析
    12.1.2特殊成员函数StringBad类的问题是由特殊成员函数引起的。这些成员函数是自动定义的,就StringBad而言,这些函数的行为与类设计不符。具体地说,C++自动提供了下面这些成员函数:1,默认构造函数,如果没有定义构造函数;2,默认析构函数,如果没有定义;3,复制构造函数,如果没有......
  • android12 Settings 添加导航栏和状态栏开关
    平台RK3568,android12添加导航栏和状态栏的开关。 通过设置系统属性来默认系统关闭导航栏和状态栏。Index:device/rockchip/rk356x/device.mk===================================================================---device/rockchip/rk356x/device.mk(revision2442......
  • Restful api
    之前写flask的时候,用的就是最原始的方式接口形式 RESTfulAPI:URL设计:基于资源设计,URL通常反映资源的层次结构。例如:GET/users(获取所有用户)POST/users(创建新用户)GET/users/{id}(获取特定用户)PUT/users/{id}(更新特定用户)DELETE/users/{id}(删除特定用户)HTTP方法:明......
  • PrestoUDF故障排除与恢复:快速解决问题
    PrestoUDF故障排除与恢复:快速解决问题1.背景介绍Presto是一种开源的大数据分析引擎,由Facebook开发和维护。它旨在快速高效地查询来自不同数据源的大型分布式数据集。Presto支持使用SQL语言进行查询,并支持用户定义函数(UDF)的扩展功能。UDF(UserDefinedFunction)允许......
  • C# 12 new feature Collection Expression,Primary Consctructor,Generic type alias,
    usinglistOfInt=System.Collections.Generic.List<int>;namespaceConsoleApp36{internalclassProgram{staticvoidMain(string[]args){GenericTypeAlias();}staticvoidGenericTypeAlias()......