zoukankan      html  css  js  c++  java
  • Django REST framework(请求和响应)

    一丶请求对象Request objects

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

    请求对象拓展了常规的HttpRequest,核心函数是request.data属性,和request.POST类似.

    二丶响应对象Response objects

    return Response(data)  # Renders to content type as requested by the client.
    

    响应对象是TemplateResponse类型,这是一种为渲染内容,并且使用内容协商来返回给客户端正确的内容类型.

    三丶状态码Status codes

    在你的视图(views)中使用纯数字的HTTP 状态码并不总是那么容易被理解。而且如果错误代码出错,很容易被忽略。REST框架为status模块中的每个状态代码(如HTTP_400_BAD_REQUEST)提供更明确的标识符。使用它们来代替纯数字的HTTP状态码是个很好的主意

    四丶包装(wrapping)API视图

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

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

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

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

    五丶一步到位

    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)
    

    六丶给我们的网址添加可选的格式后缀

    views.py下
    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)
    

    七丶查看结果

    我们可以像以前一样获取所有snippet的列表。
    
    http http://127.0.0.1:8000/snippets/
    
    HTTP/1.1 200 OK
    ...
    [
      {
        "id": 1,
        "title": "",
        "code": "foo = "bar"
    ",
        "linenos": false,
        "language": "python",
        "style": "friendly"
      },
      {
        "id": 2,
        "title": "",
        "code": "print "hello, world"
    ",
        "linenos": false,
        "language": "python",
        "style": "friendly"
      }
    ]
    我们可以通过使用Accept标头来控制我们回复的响应格式:
    
    http http://127.0.0.1:8000/snippets/ Accept:application/json  # 请求JSON
    http http://127.0.0.1:8000/snippets/ Accept:text/html         # 请求HTML
    或者通过附加格式后缀:
    
    http http://127.0.0.1:8000/snippets.json  # JSON后缀
    http http://127.0.0.1:8000/snippets.api   # 浏览器可浏览API后缀
    类似地,我们可以使用Content-Type头控制我们发送的请求的格式。
    
    # POST表单数据
    http --form POST http://127.0.0.1:8000/snippets/ code="print 123"
    
    {
      "id": 3,
      "title": "",
      "code": "print 123",
      "linenos": false,
      "language": "python",
      "style": "friendly"
    }
    
    # POST JSON数据
    http --json POST http://127.0.0.1:8000/snippets/ code="print 456"
    
    {
        "id": 4,
        "title": "",
        "code": "print 456",
        "linenos": false,
        "language": "python",
        "style": "friendly"
    }
    如果你向上述http请求添加了--debug,则可以在请求标头中查看请求类型。
    
    现在可以在浏览器中访问http://127.0.0.1:8000/snippets/查看API。
    
  • 相关阅读:
    LDAP Authentication for openNebula3.2
    opennebula auth module ldap
    opennebula extend(expending) auth module ldap
    centos6.4 ceph安装部署之ceph object storage
    centos6.4 ceph安装部署之cephFS
    ERROR: modinfo: could not find module rbd FATAL
    centos6.4 ceph安装部署之ceph block device
    Cannot retrieve metalink for repository: epel.
    卡特兰数
    iOS开发之UIImage等比缩放
  • 原文地址:https://www.cnblogs.com/cangshuchirou/p/9265115.html
Copyright © 2011-2022 走看看