Rest framework 学习(2)请求和响应

本文深入讲解了REST框架中Request和Response对象的高级用法,包括request.data和request.POST的区别,以及如何通过Response对象实现内容协商。同时,介绍了使用status模块进行错误处理的最佳实践,和如何利用@api_view和APIView类来包装API视图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

请求对象:

REST框架引入了一个Request扩展常规的对象HttpRequest,并提供更灵活的请求解析。Request对象的核心功能是request.data属性,它类似于request.POST,但对于使用Web API更有用。

request.POST  # 仅仅处理表单数据,仅用于POST方法
request.data  # 处理任意的数据,用于POST,PUT,PATCH

响应对象:

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

return Response(data)  # 换回响应内容

代码状态:

我们不再使用例如400,这样的数字表示请求状态,而是统一采用了status模块中的HTTP_400_BAD_REQUEST代替,能够更好的理解错误。

包装API视图

REST框架提供了两个可用于编写API视图的包装器。

1.@api_view用于处理基于函数的视图的装饰器。
2.和基类视图协作的APIView 类

这些包装器提供了一些功能,例如确保Request在视图中接收实例,以及向Response对象添加上下文以便可以执行内容协商。

包装器还提供行为,例如405 Method Not Allowed在适当时返回响应,以及处理使用格式错误的输入进行ParseError访问时发生的任何异常request.data。

基于以上的方法,重新修改我们的view.py 为:

from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer


@api_view(['GET', 'POST'])
def snippet_list(request):
    """
    List all code snippets, or create a new snippet.
    """
    if request.method == 'GET':
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = SnippetSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


@api_view(['GET', 'PUT', 'DELETE'])
def snippet_detail(request, pk):
    """
    Retrieve, update or delete a code snippet.
    """
    try:
        snippet = Snippet.objects.get(pk=pk)
    except Snippet.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        serializer = SnippetSerializer(snippet)
        return Response(serializer.data)

    elif request.method == 'PUT':
        serializer = SnippetSerializer(snippet, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        snippet.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

URL中添加可选的格式后缀

提供更多样的响应格式

# view.py
def snippet_list(request, format=None):

# urls.py
from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views

urlpatterns = [
    path('snippets/', views.snippet_list),
    path('snippets/<int:pk>', views.snippet_detail),
]

urlpatterns = format_suffix_patterns(urlpatterns)  # 这里对urlpatterns 进行加内容类型

至此,我们得到了更便捷的请求和响应,响应内容中有正确的状态码提示,API接口换回内容,以级内容格式更多样。直接访问能得到http代码,方便调试接口。

 

# 个人理解,有误请指正 #

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值