美文网首页Drf/Django开发记录
Drf官网教程(二) - Request,Response &a

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

作者: dyq666 | 来源:发表于2018-06-23 02:46 被阅读106次

    目录

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

    1. Request对象

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

    • Django中当请求的Method是POST时,使用request.POST能获取请求中的表单数据。
    • Drf中无论是POSTPUTPATCH中的哪种Method,都使用request.data获取请求中的表单数据。

    2. Response对象

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

    • Django中返回时需要判断使用HttpResponse还是JsonResponse
    • Drf中只需要使用Response,不需要抉择。

    具体使用方法:

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

    3. 状态码

    • Django中使用数字作为状态码。例如:
    from django.http import HttpResponse
    
    def xxx():
        ...
        return HttpResponse(status=400)
    
    • Drf中使用文字+数字的方式。例如:
    from rest_framework import status
    from rest_framework.response import Response
    
    def xxx():
        ...
        return Response(status=status.HTTP_400_BAD_REQUEST)
    

    4. Drf中的APIView

    • Drf提供了两种方式让Django的view变成Drf的APIView:
      1. FBV(基于函数的):@api_view,在使用时需要注明需要使用哪些HTTP-METHOD,例如使用GETPOST时需要使用这种装饰器:@api_view(['GET', 'POST'])
      2. CBV(基于类的):View类继承APIView
    • 使用APIView的好处:
      1. 确保接受和返回的时都可以使用Drf提供的RequestResponse
      2. 会自动处理序列化章节中View部分提到的未完善的部分,例如Json格式不对,Method无法处理,解析失败等情况(会自动返回对应的错误码,不用再手动处理)。
    • 更改View部分

    阅读代码前需要注意以下几点:
    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。(具体部分在下面测试中将展示)

    • 为view增加一个参数format,官网推荐的值为None
    def snippet_list(request, format=None):
        ...
    
    def snippet_detail(request, pk, format=None):
        ...
    
    • 修改snippets\urls.py
    ...
    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"
    

    相关文章

      网友评论

      • 獨孤鬱悶:如果結尾是xml 就會返回xml格式的數據嗎?如果是的話 那在代碼裡面如果實現?是request.data中獲取format數值 然後進行判斷 如果是xml 則調用xml serializer嗎
        dyq666:这个format应该是让你更方便的观察数据。你要的应该是序列化相关的,你可以去官网查看xml解析器,我没使用过xml,默认情况下drf应该是用json解析器的。

      本文标题:Drf官网教程(二) - Request,Response &a

      本文链接:https://www.haomeiwen.com/subject/gbzlyftx.html