drf之day04: drf请求与响应,drf能够解析的请求编码,响应编码,drf之视图组件,2个视图基类

这篇具有很好参考价值的文章主要介绍了drf之day04: drf请求与响应,drf能够解析的请求编码,响应编码,drf之视图组件,2个视图基类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一:drf之请求与响应

1.Request类

1.继承APIView后,请求对象requests每次请求都是一个新的request

2.data: POST, PUT, PATCH请求方式解析后的数据

3.原生django,put提交的数据在request.POST中是娶不到的

4.其他方法用起来和之前是一样的(method, FILES, path)

2.Response类
参数 功能
data=None 把字典,列表序列化成json格式字符串,放到http请求的body中,返回给前端
status=None http响应状态码,默认是200, 201
headers=None http的响应头,是字典格式:{‘name’: ‘zhang’}
template_name=None 在浏览器中看到好看的页面,指定的模板
content_type=None 响应编码格式(json)

二.drf能够解析的请求编码,响应编码

1.请求编码
1.默认能解析的请求编码
  • urlencoded,form-data, json
2.如何配置请求编码

其实在drf内置的配置文件中提前就配好了请求编码

drf配置文件settings.py中有DEFAULT_PARSER_CLASSES(默认的解析类)

'rest_framework.parsers.JSONParser', 可以解析json格式
'rest_framework.parsers.FormParser', 可以解析urlencoded格式
'rest_framework.parsers.MultiPartParser' 可以解析form-data格式
方式一:全局配置
REST_FRAMEWORK = {
                'DEFAULT_PARSER_CLASSES': [
                    'rest_framework.parsers.JSONParser',
                    # 'rest_framework.parsers.FormParser',
                    # 'rest_framework.parsers.MultiPartParser',
                ],
            }
方式二:局部配置
from rest_framework.parsers import JSONParser, FormParser, MultiPartParser

class TestView(APIView):
    		parser_classes = [JSONParser,FormParser,MultiPartParser]
2.响应编码

如果用浏览器接收响应,看到的是好看的页面,如果用postman,看到的是json格式

默认情况下,响应的编码是根据客户端类型决定的

方式一:全局配置
    REST_FRAMEWORK = {
        'DEFAULT_RENDERER_CLASSES': [
            # 'rest_framework.renderers.JSONRenderer', # json格式
            'rest_framework.renderers.BrowsableAPIRenderer', #浏览器的格式
        ]
    }
方式二:局部配置
from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer

class TestView(APIView):
    renderer_classes = [JSONRenderer,]

三:drf之视图组件

1.由于drf提供了一个顶层的视图类APIView,以后直接继承APIView写视图类即可

2.后期可以使用面向对象的继承,封装

四:2个视图基类

1.APIView

2.GenericAPIView(继承了APIView)

3.方法:

方法 作用
self.get_object() 根据pk获取单个数据
self.get_serializer() 获取要使用的序列化类
self.get_queryset() 获取所有要序列化的数据

作业:

一:继承GenericAPIView,实现5个接口

models.py

class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.CharField(max_length=32)
    publish = models.CharField(max_length=32)

serializer.py

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

views.py

class BookView(GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    def get(self, request):
        book_list = self.get_queryset()
        ser = self.get_serializer(instance=book_list, many=True)
        return Response(data=ser.data)

    def post(self, request):
        ser = self.get_serializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        else:
            return Response(ser.errors)


class BookDetailView(GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    def get(self, request, pk):
        book = self.get_object()
        ser = self.get_serializer(instance=book)
        return Response(ser.data)

    def put(self, request, pk):
        book = self.get_object()
        ser = self.get_serializer(instance=book, data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        else:
            return Response({'code': 100, 'msg': '修改成功'})

    def delete(self, request, pk):
        self.get_queryset().filter(pk=pk).delete()
        return Response('ok')

urls.py文章来源地址https://www.toymoban.com/news/detail-411060.html

    path('books/', views.BookView.as_view()),
    path('books/<int:pk>/', views.BookDetailView.as_view()),
二:2 使用面向对象,写5个父类, 继承GenericAPIView+某几个父类后,就有某几个接口
  • 方法一:
class CheckOne(GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    def get(self, request, pk):
        book = self.get_object()
        ser = self.get_serializer(instance=book)
        return Response(ser.data)


class CheckAll(GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    def get(self, request):
        book_list = self.get_queryset()
        ser = self.get_serializer(instance=book_list, many=True)
        return Response(data=ser.data)


class AddOne(GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    def post(self, request):
        ser = self.get_serializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        else:
            return Response(ser.errors)


class ChangeOne(GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    def put(self, request, pk):
        book = self.get_object()
        ser = self.get_serializer(instance=book, data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        else:
            return Response({'code': 100, 'msg': '修改成功'})


class DeleteOne(GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    def delete(self, request, pk):
        self.get_queryset().filter(pk=pk).delete()
        return Response('ok')


class BookView(CheckAll, AddOne):
    def __init__(self):
        super(CheckAll, self).__init__()
        super(AddOne, self).__init__()


class BookDetailView(CheckOne, ChangeOne, DeleteOne):
    def __init__(self):
        super(CheckOne, self).__init__()
        super(ChangeOne, self).__init__()
        super(DeleteOne, self).__init__()
  • 方法二:
class CheckOne:
    def get(self, request, pk):
        book = self.get_object()
        ser = self.get_serializer(instance=book)
        return Response(ser.data)
    
class CheckAll:
    def get(self, request):
        book_list = self.get_queryset()
        ser = self.get_serializer(instance=book_list, many=True)
        return Response(data=ser.data)

class AddOne:
    def post(self, request):
        ser = self.get_serializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        else:
            return Response(ser.errors)

class ChangeOne:
    def put(self, request, pk):
        book = self.get_object()
        ser = self.get_serializer(instance=book, data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        else:
            return Response({'code': 100, 'msg': '修改成功'})

class DeleteOne:
    def delete(self, request, pk):
        self.get_queryset().filter(pk=pk).delete()
        return Response('ok')

class BookView(GenericAPIView, CheckAll, AddOne):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    def __init__(self):
        super(CheckAll, self).__init__()
        super(AddOne, self).__init__()

class BookDetailView(GenericAPIView, CheckOne, ChangeOne, DeleteOne):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    def __init__(self):
        super(CheckOne, self).__init__()
        super(ChangeOne, self).__init__()
        super(DeleteOne, self).__init__()
三:写9个视图子类
# Create your views here.

# 1:查看一条数据
class CheckOne:
    def get(self, request, pk):
        book = self.get_object()
        ser = self.get_serializer(instance=book)
        return Response(ser.data)
# 2:查看所有数据
class CheckAll:
    def get(self, request):
        book_list = self.get_queryset()
        ser = self.get_serializer(instance=book_list, many=True)
        return Response(data=ser.data)
# 3.增加一条数据
class AddOne:
    def post(self, request):
        ser = self.get_serializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        else:
            return Response(ser.errors)
# 4:修改一条数据
class ChangeOne:
    def put(self, request, pk):
        book = self.get_object()
        ser = self.get_serializer(instance=book, data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        else:
            return Response({'code': 100, 'msg': '修改成功'})
# 5:删除一条数据
class DeleteOne:
    def delete(self, request, pk):
        self.get_queryset().filter(pk=pk).delete()
        return Response('ok')

# 6:查看所有+增加一条
class GetAllandPost(CheckAll, AddOne):
    def __init__(self):
        super(CheckAll, self).__init__()
        super(AddOne, self).__init__()

# 7:查看一条+修改一条
class GetOneandPut(CheckOne, ChangeOne):
    def __init__(self):
        super(CheckOne, self).__init__()
        super(ChangeOne, self).__init__()

# 8:查看一条+删除一条
class GetOneandDelete(CheckOne, DeleteOne):
    def __init__(self):
        super(CheckOne, self).__init__()
        super(DeleteOne, self).__init__()
# 9:删除一条+修改一条
class DeleteandPut(DeleteOne, ChangeOne):
    def __init__(self):
        super(DeleteOne, self).__init__()
        super(DeleteOne, self).__init__()

# class BookView(GenericAPIView, CheckAll, AddOne):
#     queryset = Book.objects.all()
#     serializer_class = BookSerializer
#     def __init__(self):
#         super(CheckAll, self).__init__()
#         super(AddOne, self).__init__()


# class BookDetailView(GenericAPIView, CheckOne, ChangeOne, DeleteOne):
#     queryset = Book.objects.all()
#     serializer_class = BookSerializer
#     def __init__(self):
#         super(CheckOne, self).__init__()
#         super(ChangeOne, self).__init__()
#         super(DeleteOne, self).__init__()

class BookDetailView(GenericAPIView,GetOneandPut):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    def __init__(self):
        super(CheckOne, self).__init__()
        super(ChangeOne, self).__init__()
        
class BookView(GenericAPIView, GetAllandPost):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    def __init__(self):
        super(GetAllandPost, self).__init__()

到了这里,关于drf之day04: drf请求与响应,drf能够解析的请求编码,响应编码,drf之视图组件,2个视图基类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 后端服务器的响应为什么能够精准的返回给请求它的那个客户端

    正向代理位于客户端和目标服务器之间,代表客户端发送请求;–》代理客户端 反向代理位于目标服务器和客户端之间,代表目标服务器接收请求。–》代理服务端 当客户端发送请求到反向代理服务器时,反向代理服务器会在转发请求给后端服务器之前,记录请求的源IP地址

    2024年02月12日
    浏览(38)
  • Django视图-HttpRequest请求对象和HttpResponse响应对象

    服务器在接收到Http请求后,会根据报文创建HttpRequest对象 视图中的第一个参数就是HttpRequest对象 Django框架接收到http请求之后会将http请求包装为HttpRequest对象,之后传递给视图。 新建一个项目 Day05DjangoPro,创建一个应用 叫App 不写子路由啦,直接写根路由 Day05DjangoProurls.py A

    2024年02月12日
    浏览(33)
  • Day05-作业(SpringBootWeb请求响应)

    测试接口数据,提取码:5555(将上述json文件,下载并导入postman) https://pan.baidu.com/s/1rwUfKTCgncB_xxarzOUpfA 需求: springboot的版本选择 2.7.x 勾选 web 开发的依赖 定义Controller 及 方法,完成如下参数接收的需求 : 1. 定义方法,方法中定义三个参数,完成 简单参数接收          备

    2024年02月14日
    浏览(30)
  • Day04 03-MySQL数据库的DCL(用户|权限|视图)

    第十二章 DCL 12.1 DCL的作用 DCL语句主要用来做用户的创建、管理,权限的授予、撤销等操作的。 12.2 管理用户 创建、删除用户的操作,必须要使用root用户才可以完成! 12.3 权限管理 如果在授权远程登录的时候,出现如下问题: Unable to load authentication plugin ‘caching_sha2_password’

    2024年02月07日
    浏览(47)
  • Java学习笔记-day06-响应式编程Reactor与Callback、CompletableFuture三种形式异步编码对比

    Reactor 是一个基于Reactive Streams规范的响应式编程框架。它提供了一组用于构建异步、事件驱动、响应式应用程序的工具和库。Reactor 的核心是 Flux (表示一个包含零到多个元素的异步序列)和 Mono 表示一个包含零或一个元素的异步序列)。 Reactor 通过提供响应式的操作符,如

    2024年02月03日
    浏览(33)
  • Python发送Post请求及解析响应结果

    有时候遇到请求url中有很多参数。 1.1 示例1 accounts和pwd请到http://shop-xo.hctestedu.com/注册。 执行结果: 1.2 示例2 使用不定长参数 params,将url中需要的参数单独封装。 执行结果: 用type()查看response.text的类型,是str 执行结果: 用type()查看response.json()的类型,是dict 执行结果:

    2023年04月24日
    浏览(76)
  • Spring/SpringBoot 过滤器修改、获取http 请求request中的参数 和 response返回值,比如修改请求体和响应体的字符编码

    通过自定义filter,RequestWrapper,ResponseWrapper 处理请求和响应数据,比如修改请求体和响应体的字符编码 1.request 和 response 中的数据都是 存在流中的(缓存中)获取一次就没有了,需要重新写回去。所以需要两个包装类分别继承HttpServletRequestWrapper 和 HttpServletResponseWrapper 对 r

    2024年02月15日
    浏览(32)
  • java发送soap请求和解析soap的响应

    2024年02月11日
    浏览(44)
  • 【Unity-UGUI控件全面解析】| ScrollView 滚动视图组件详解

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:

    2024年02月06日
    浏览(41)
  • HTTP响应状态码大全:从100到511,全面解析HTTP请求的各种情况

    为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。 (博客的参考源码可以在我主页的资源里找到,如果在学习的

    2024年02月12日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包