Drf/Django开发记录

Drf官网教程(二) - Request,Response &a

2018-06-23  本文已影响106人  dyq666

目录

  1. Request对象
  2. Response对象
  3. 状态码
  4. Drf中的APIView
  5. 为Url添加可选择的后缀
  6. 测试多样性的后缀

1. Request对象

Drf的Request对象是在Django的HttpRequest对象上进行了功能的扩展。最核心的功能就是request.data

2. Response对象

使用Response对象时只需要传入数据即可,Response会自动返回客户端需要的类型。

具体使用方法:

def xxx():
    ...
    return Response(data)

3. 状态码

from django.http import HttpResponse

def xxx():
    ...
    return HttpResponse(status=400)
from rest_framework import status
from rest_framework.response import Response

def xxx():
    ...
    return Response(status=status.HTTP_400_BAD_REQUEST)

4. Drf中的APIView

阅读代码前需要注意以下几点:
1. 返回时,Django中状态码的默认值是200(上一章没有提到这点,所有status都是指明的,没有使用默认值),Drf也继承了这个观念,状态码的默认值是status.HTTP_200_OK
2. 获取的字节流不用再通过Json解析,request.data中存放了Json解析后的值。
3. 其余更改部分都是上文提到的。例如装饰器,返回对象,状态码。

from rest_framework import status
from rest_framework.response import Response
from rest_framework.decorators import api_view

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


@api_view(['GET', 'POST'])
def snippet_list(request):
    """list, create"""

    if request.method == 'GET':
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        # 改状态码
        return Response(serializer.data)

    elif request.method == 'POST':
        # 取消了用JSON解析请求的步骤
        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, delete"""

    try:
        snippet = Snippet.objects.get(pk=pk)
    except Snippet.DoesNotExist:
        # 不用再判断是返回JsonResponse还是普通的HttpResponse
        return Response(status=status.HTTP_404_NOT_FOUND)

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

    elif request.method == 'PUT':
        # update
        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()
        # 204不返回内容
        return Response(status=status.HTTP_204_NO_CONTENT)

5. 为Url添加可选择的后缀

例如可以让数据显示为Html,显示为Json。(具体部分在下面测试中将展示)

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

def snippet_detail(request, pk, format=None):
    ...
...
from rest_framework.urlpatterns import format_suffix_patterns
...

urlpatterns = format_suffix_patterns([
    ...
])

6. 测试多样性的后缀

与第一章相同可用两种方式来进行测试:终端和网页。

在这里先介绍网页版的原因是通常都会使用网页版来进行测试,因为不用额外的记一些命令。
启动Django后打开http://127.0.0.1:8000/snippets/就可以看到Drf为我们提供的BrowserAPI。


简单的讲解下网页中的内容,GET按钮下可以选择api或者是json。OPTIONS则是获取头信息,下方可以提交表单。
  1. 使用header参数-Accept
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
  1. 使用后缀
http http://127.0.0.1:8000/snippets.json  # JSON suffix
http http://127.0.0.1:8000/snippets.api   # Browsable API suffix
  1. 提交表单
# POST using form data
http --form POST http://127.0.0.1:8000/snippets/ code="print 123"
# POST using JSON
http --json POST http://127.0.0.1:8000/snippets/ code="print 456"
上一篇下一篇

猜你喜欢

热点阅读