教程2--请求和响应

教程2–请求和响应

tips:本文纯属瞎翻译,还加了一点自己的理解。大家参考就好。

这里说的请求和响应是指扩展了Django的REST框架的请求和响应。

请求对象

Request对象拓展了HttpRequest对象。并且提供了更加灵活的请求解析。Request的核心功能是request.data,这个和request.POST比较类似,但是POST本身只能用来解析表单数据。

request.POST  # Only handles form data.  Only works for 'POST' method.
request.data  # Handles arbitrary data.  Works for 'POST', 'PUT' and 'PATCH' methods.

响应对象

Response继承了TemplateResponse。它使用一种叫做内容协商的工具来决定如何渲染数据。

状态码

纯数字的状态码阅读性很差,所以REST框架提供了一些可读性较高的状态码表示,例如:在status模块中的HTTP_400_BAD_REQUEST

包装API views

REST框架提供了两种包装方式:

  1. 使用@api_view装饰器——适用于基于函数的视图。
  2. 使用APIView类——适用于基于类的视图。

包装API views的主要作用是将Request替换成REST框架的请求对象,并且为Response添加上下文信息,这个上下文信息中就包含着内容协商,以此,Response可以渲染数据。
包装类还提供了一些很方便的用途,例如自动返回错误状态码等。

开工!

上面说了一大堆理论,下面开始用一下试试看。

因为我们现在直接使用REST框架的Response了,所以不需要再用JSONResponse了,把它干掉!

# coding=utf-8
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.parsers import JSONParser
from rest_framework.response import Response

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer


@api_view(["GET", "POST"])
def snippet_list(request):
    if request.method == 'GET':
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        return Response(serializer.data)
    elif request.method == 'POST':
        data = JSONParser().parse(request)
        serializer = SnippetSerializer(data=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):
    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':
        data = JSONParser().parse(request)
        # 如果需要更新(调用update方法),则需要传入一个已经存在的模型实例!
        serializer = SnippetSerializer(snippet, data=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)

现在的代码看起来更简洁了一些,而且可读性也很好。
通过使用REST的Response我们可以将响应渲染成任意格式。

为URL添加可选的格式后缀

为了证明现在的返回格式可以是灵活多变的了,我们来看下这个例子。首先,要为视图函数添加参数format

def snippet_list(request, format=None):
    ...
def snippet_detail(request, pk, format=None):
    ...

然后修改urls.py

from django.conf.urls import url
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views

urlpatterns = [
    url(r'^snippets/$', views.snippet_list),
    url(r'^snippets/(?P<pk>[0-9]+)$', views.snippet_detail),
]

urlpatterns = format_suffix_patterns(urlpatterns)

我们可以使用Httpie进行测试

http http://127.0.0.1:8000/snippets/ Accept:application/json  # Request JSON
http http://127.0.0.1:8000/snippets/ Accept:text/html         # Request HTML
http http://127.0.0.1:8000/snippets.json  # JSON suffix
http http://127.0.0.1:8000/snippets.api   # Browsable API suffix

对浏览器的支持

由于REST框架的响应值形式是根据请求的content-type来的,浏览器默认的请求就是html,所以返回的都是html类型的数据。这其实是一个巨大的提高,这样我们开发和调试接口更方便了,而且那些不懂技术但是却要检查我们API正确性的人也能看得懂了。

下一章

下一章我们来讲基于类的视图,一起来看看如何使用通用视图来缩减代码量。

springboot100基于Springboot+Vue精准扶贫管理系统-毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值