【问题标题】:Making HTTP GET request that target a collection of instances in DjangoRESTFUL发出以 DjangoRESTFUL 中的实例集合为目标的 HTTP GET 请求
【发布时间】:2019-10-10 12:20:58
【问题描述】:

我开始检查序列化程序是否按预期工作,但在运行代码后它没有显示任何输出。

from datetime import datetime 
from django.utils import timezone
from django.utils.six import BytesIO
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from toys.models import Toy
from toys.serializers import ToySerializer




toy_release_date = timezone.make_aware(datetime.now(),
 timezone.get_current_timezone())
toy1 = Toy(name='Snoopy talking action figure',
 description='Snoopy spearks five languages')
toy1,save()
toy2 = Toy(name='Hawaiian Barbie', 
description= 'Barbie loves Hawaii',
 release_date="")
toy2.save()


print(toy1.pk)
print(toy1.name)
print(toy1.created)
print(toy1.was_inclded_in_home)
print(toy2.pk)
print(toy2.name)
print(toy2.created)
print(toy2.was_included_in_home)



serializer_for_toy1 = ToySerializer(toy1)
print(serializer_for_toy1.data)

serializer_for_toy2 = ToySerializer(toy2)
print(serializer_for_toy2.data)


json_renderer = JSONRenderer()
toy1_rendered_into_json = jason_renderer.render(serializer_for_toy1.data)
toy2_rendered_into_json = json_renderer.render(serializer_for_toy2.data)
print(toy1_rendered_into_json)
print(toy2_rendered_into_json)


json_string_for_new_toy = '{"name":"Clash Royale play set","descriptions":"6 figures from Clash Royele"}'
json_bytes_for_new_toy = bytes(json_string_for_new_toy, encoding="UTF-8")
stream_for_new_toy = BytesOI(json_bytes_for_new_toy)
parser = JSONParser()
parsed_new_toy =parser.parse(stream_for_new_toy)
print(parsed_new_toy)

new_toy_serializer = ToySerializer(data=parsed_new_toy)
if new_toy_serializer.is_valid():
    toy3 = new_toy_serializer.save()
    print(toy3.name)

但后来我开始创建结合序列化程序类的 Django 视图。

from django.shortcuts import render
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from rest_framework import status
from toys.models import Toy
from toys.serializers import ToySerializer 


class JSONResponse(HttpResponse):
    def __init__(self, data, **kwargs):
        content = JSONRenderer().render(data)
        kwargs['content_type'] ='application/json'
        super(JSONResponse, self).__init__(content, **kwargs)


@csrf_exempt
def toy_list(request):
    if request.method == 'GET':
        toys = Toy.objects.all()
        toys_serializer = ToySerializer(toys, many=True)
        return JSONResponse(toys_serializer.data)

    elif request.method == 'POST':
        toy_data = JSONParser().parse(request)
        toys_serializer = ToySerializer(data=toy_data)
        if toys_serializer.is_valid():
            toys_serializer.save()
            return JSONResponse(toy_serializer.data, \
                status=status.HTTP_201_CREATED)
        return JSONResponse(toy_serializer.errors, \
            status=status.HTTP_400_BAD_REQUEST)


@csrf_exempt
def toy_detail(request, pk):
    try:
        toy = Toy.objects.get(pk=pk)
    except Toy.DoesNotExist:
        return HttpResponse(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        toy_serializer = ToySerializer(toy)
        return JSONResponse(toy_serializer.data)

    elif request.method == 'PUT':
        toy_data = JSONParser().parse(request)
        toy_serializer = ToySerializer(toy, data=toy_data)
        if toy_serializer.is_valid():
            toy_serializer.save()
            return JSONResponse(toy_serializer.data)
        return JSONResponse(toy_serializer.errors, \
            status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE' :
        toy.delete()
        return HttpResponse(status=status.HTTP_204_NO_CONTENT)


这是我的 serializer.py 内容,但在我向 HTTP 发出请求后,此 serializer.py 中的内容不显示。

from rest_framework import serializers
from toys.models import Toy

class ToySerializer(serializers.Serializer):
    pk = serializers.IntegerField(read_only=True)
    name = serializers.CharField(max_length=150)
    description = serializers.CharField(max_length=250)
    release_date = serializers.DateTimeField()
    toy_category = serializers.CharField(max_length=200)
    was_included_in_home = serializers.BooleanField(required=False)

    def create(self,validated_data):
        return Toy.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.name = validated_data.get('name',instance.name)
        instance.description = validated_data.get('description', instance.description)
        instance.release_date = validated_data.get('release_date',instance.release_date)
        instance.toy_category = validated_data.get('toy_category',instance.toy_category)
        instance.was_included_in_home = validated_data.get('was_included_in_home',instance.was_included_in_home)
        instance.save()
        return instance

在创建视图并尝试使用 curl 发出 HTTP GET 请求后,我没有得到 JSONResponse 的输出,但它只显示一个空字典(方括号, [] ),我希望它会在序列化程序中显示内容。 py 文件,我想知道我的代码有什么问题。这是发出 HTTP 请求的代码。

curl -x GET localhost:8000/toys/

#With this code it shows only the header without the JSON response and an empty [].
curl -ix GET localhost:8000/toys/  



from datetime import datetime 
from django.utils import timezone
from django.utils.six import BytesIO
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from toys.models import Toy
from toys.serializers import ToySerializer




toy_release_date = timezone.make_aware(datetime.now(),
 timezone.get_current_timezone())
toy1 = Toy(name='Snoopy talking action figure',
 description='Snoopy spearks five languages')
toy1,save()
toy2 = Toy(name='Hawaiian Barbie', 
description= 'Barbie loves Hawaii',
 release_date="")
toy2.save()


print(toy1.pk)
print(toy1.name)
print(toy1.created)
print(toy1.was_inclded_in_home)
print(toy2.pk)
print(toy2.name)
print(toy2.created)
print(toy2.was_included_in_home)



serializer_for_toy1 = ToySerializer(toy1)
print(serializer_for_toy1.data)

serializer_for_toy2 = ToySerializer(toy2)
print(serializer_for_toy2.data)


json_renderer = JSONRenderer()
toy1_rendered_into_json = jason_renderer.render(serializer_for_toy1.data)
toy2_rendered_into_json = json_renderer.render(serializer_for_toy2.data)
print(toy1_rendered_into_json)
print(toy2_rendered_into_json)


json_string_for_new_toy = '{"name":"Clash Royale play set","descriptions":"6 figures from Clash Royele"}'
json_bytes_for_new_toy = bytes(json_string_for_new_toy, encoding="UTF-8")
stream_for_new_toy = BytesOI(json_bytes_for_new_toy)
parser = JSONParser()
parsed_new_toy =parser.parse(stream_for_new_toy)
print(parsed_new_toy)

new_toy_serializer = ToySerializer(data=parsed_new_toy)
if new_toy_serializer.is_valid():
    toy3 = new_toy_serializer.save()
    print(toy3.name)


【问题讨论】:

  • 你应该调试它并找出在哪个点返回一个空的json列表。

标签: json django django-rest-framework


【解决方案1】:

如果您使用的是 DRF,那么最好遵循他们的文档。

正如documentation中所述:

REST 框架还允许您使用基于常规功能的视图。它提供了一组简单的装饰器来包装基于函数的视图,以确保它们接收请求实例(而不是通常的 Django HttpRequest)并允许它们返回响应(而不是 Django HttpResponse),并允许您配置如何请求已处理。

所以你需要用 api_view 装饰器包装你的函数并从函数中返回 Response 。例如在你的情况下:

from rest_framework.decorators import api_view
from rest_framework.response import Respons

@api_view(['GET', 'POST'])
def toy_list(request):
    if request.method == 'GET':
        toys = Toy.objects.all()
        toys_serializer = ToySerializer(toys, many=True)
        return Response(toys_serializer.data)

    elif request.method == 'POST':
        toys_serializer = ToySerializer(data=toy_data)
        if toys_serializer.is_valid():
            toys_serializer.save()
            return Response(toy_serializer.data, \
                status=status.HTTP_201_CREATED)
        return Response(toy_serializer.errors, \
            status=status.HTTP_400_BAD_REQUEST)

【讨论】:

  • 我刚刚完成了将你的函数包装到我的,但我仍然得到相同的空字典,我原以为它应该在我向 HTTP 发出请求时在 serializer.py 中显示 JSON 文件.标头显示 HTTP/1.1 200 OK。但它也应该显示 JSON 文件。谢谢!我希望尽快找到解决方案。
  • 你之前有没有创建过玩具实例?
  • 是的,我做到了,它是我在这里发布的代码的一部分,如果你可以看一下,它就是 serializer.py。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
相关资源
最近更新 更多