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

请求对象:

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代码,方便调试接口。

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django Rest Framework是一个用于构建Web API的强大框架。它可以帮助我们快速开发和管理API接口,并提供了许多有用的功能和工具。安装Django Rest Framework的方法是使用pip3命令进行安装,例如:pip3 install djangorestframework。在项目的settings.py文件中注册Django Rest Framework应用,将'rest_framework'添加到INSTALLED_APPS列表中。此外,还需要进行一些国际化和时区的配置,例如设置LANGUAGE_CODE为'zh-hans',TIME_ZONE为'Asia/Shanghai',并设置USE_I18N为True,USE_L10N为True,USE_TZ为False。你可以使用Django Rest Framework提供的许多功能和组件,如APIView用于定义API视图类,Response用于返回响应数据,Serializer用于定义序列化器,APISettings用于配置API设置,SearchFilter用于搜索过滤,PageNumberPagination用于分页,TokenAuthentication用于身份认证,IsAuthenticated用于权限控制,SimpleRateThrottle用于请求限制等。 Django Rest Framework还支持自定义返回方式,可以根据自己的需求来设计返回的数据格式。它是一个非常方便和强大的框架,特别适用于前后端分离的应用模式,通过定义API接口,可以使前端和后端的交互更加简单和高效。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [REST framework 简介](https://blog.csdn.net/Waller_/article/details/104292515)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [django rest framework 自定义返回方式](https://download.csdn.net/download/weixin_38629274/12849864)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【rest_framework】入门教程 | 虚拟环境](https://blog.csdn.net/qq_42438771/article/details/107964290)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值