Django REST Framework——4. 请求与响应

一、请求对象(Request Object)

DRF传入视图的request对象不再是Django默认的HttpRequest对象,而是DRF提供的扩展后的request对象。Request对象的核心功能是request.data属性,它与request.POST类似,但对于使用Web API更为有用。

request.POST  # 只处理表单数据  只适用于'POST'方法
request.data  # 处理任意数据  适用于'POST','PUT'和'PATCH'方法

常用属性

  • data

    request.data 返回解析之后的请求体数据。类似于Django中的request.POSTrequest.FILES属性,但提供如下特性:

    • 包含了解析之后的文件和非文件数据;
    • 包含了对POST、PUT、PATCH请求方式解析后的数据;
    • 利用了DRF的parsers解析器,不仅支持表单类型数据,也支持JSON数据。
  • query_params

    request.query_params与Django标准的request.GET相同,只是更换了更正确的名称而已。因为任何HTTP方法类型都可能包括查询参数,而不仅仅是GET请求。

二、响应对象(Response Object)

REST框架还引入了一个Response对象,这是一种TemplateResponse类型,它接受未呈现的内容,并使用内容协商来确定返回给客户端的正确内容类型。

return Response(data)  # 根据客户端请求类型渲染内容

2.1 常用属性

  • data

    Response未渲染的序列化数据。

  • status_code

    HTTP响应的数字状态码。

  • content

    渲染好的响应内容,但必须先调用render()方法,才能访问content

2.2 自定义Response对象

from rest_framework.response import Response


class CustomResponse(Response):
    # 比父类多了code和msg两个实例属性
    def __init__(self, code=1000, msg="成功", data=None, status=None, template_name=None, headers=None, content_type=None, **kwargs):
        custom_data = {'code':code, 'msg': msg}
        if data:
            custom_data = {'code':code, 'msg': msg, 'data':data}
        custom_data.update(kwargs)
        super().__init__(data=custom_data, status=status, template_name=template_name, headers=headers, content_type=content_type)
    

"""
使用时,就要返回CustomResponse类的对象了
return CustomResponse(data={'name':'hugh'},……)
""" 

三、状态码(Status codes)

在视图中使用纯数字的状态码,会导致可读性很差,并且容易忽视掉错误或警告。DRF对每一个状态码提供了更加清楚、直观的标识符,其本质是一些常量,将纯数字的状态码保存了起来而已。比如HTTP_400_BAD_REQUEST,保存的就是数字400。

3.1 使用方法

虽然实现简单,但使用这些标识符(常量)的确可以使代码更加清晰、易读。比如:

from rest_framework import status
from rest_framework.response import Response

def empty_view(self):
    content = {'请求的资源不存在'}
    return Response(content, status=status.HTTP_404_NOT_FOUND)

这些标识符(常量)仅仅是加了HTTP前缀和一些状态关键字后缀。只要我们知道要使用哪个状态码,就可以通过IDE的自动补全打出完整名称,无需去逐个了解😄。

3.2 辅助函数

rest_framework.status模块还包括一组辅助函数,用于测试状态代码是否在给定范围内。

完整的函数列表如下:

is_informational(status.HTTP_404_NOT_FOUND)  # 判断是否在1~199之间,返回布尔值,下面的以此类推
is_success()        # 2xx
is_redirect()       # 3xx
is_client_error()   # 4xx
is_server_error()   # 5xx

四、配置默认Response渲染器

4.1 全局配置

在项目配置文件settings.py中:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ]
}

4.2 局部配置

在需要配置的视图中:

from rest_framework.renderers import JSONRenderer
from rest_framework.views import APIView

class AView(APIView):

    renderer_classes = [JSONRenderer]

    def get(self, request):
        ……

4.3 渲染器类

  • JSONRenderer:

    使用utf-8编码将数据呈现为JSON,该渲染器是默认启用的。

    media_typeapplication/json

  • TemplateHTMLRenderer:

    使用Django的标准模板渲染将数据渲染到HTML中,传递给Response的数据不需要序列化,但可能需要template_name参数。

    media_typetext/html

  • BrowsableAPIRenderer:

    将数据渲染成可浏览的API,也就是通过浏览器打开时默认的样子,所以,该渲染器是默认启用的。

    media_type: text/html

    渲染器类种类繁多,但不常用。感兴趣可以参考官方文档:传送门

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
`rest_framework.routers.DefaultRouter`是 Django REST framework 中提供的一个路由器类,用于自动注册视图集(Viewset)并为它们生成 URL。 在 Django 中,我们可以使用 `urls.py` 文件来定义 URL 和视图之间的映射关系。但是,随着 RESTful API 的流行,单独编写每个 URL 映射的代码变得非常繁琐。为此,Django REST framework 提供了 `DefaultRouter`,它可以自动将视图集注册到路由器中,并为每个视图集生成标准的 URL 模式。 使用 `DefaultRouter`,我们可以将视图集注册到路由器中,并将其分配给特定的 URL 前缀。例如,如果我们有一个视图集 `MyModelViewSet`,我们可以将其注册到路由器中,然后将其分配给 `/api/mymodel/` URL 前缀: ```python from rest_framework import routers from myapp.views import MyModelViewSet router = routers.DefaultRouter() router.register(r'mymodel', MyModelViewSet) urlpatterns = [ # ... path('api/', include(router.urls)), # ... ] ``` 这样,我们就可以通过以下 URL 访问 `MyModelViewSet` 中定义的不同操作: - `GET /api/mymodel/`:获取 `MyModel` 对象列表 - `POST /api/mymodel/`:创建一个新的 `MyModel` 对象 - `GET /api/mymodel/{pk}/`:获取具有给定 ID 的 `MyModel` 对象的详细信息 - `PUT /api/mymodel/{pk}/`:更新具有给定 ID 的 `MyModel` 对象 - `DELETE /api/mymodel/{pk}/`:删除具有给定 ID 的 `MyModel` 对象 总之,`DefaultRouter` 简化了 Django REST framework 中 URL 和视图之间的映射关系的配置,使得代码更加简洁和易于维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花_城

你的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值