(Django)将POST ID发送回客户端

时间:2019-07-17 17:36:45

标签: python django django-rest-framework

我是Django的新手,正在尝试创建一些基本的API。但是困扰我的一件事是如何为某些(异步)事件发生时创建回调函数

例如,我最简单的情况之一是客户端发送POST请求的情况。我想发回给他数据库中那个请求的ID 。我该怎么办?

我的代码主要遵循威廉·文森特(William S. Vincent)的Django for APIs一书,并做了少量修改。

最重要的部分是:

models.py

from django.db import models

class SegmentcliApi(models.Model): 

    request_id = models.AutoField(primary_key = True)
    database = models.CharField(max_length = 100)
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

    def __str__(self): 

        return f'DB Request to {self.database}: created at {self.created_at}'

serializers.py

from rest_framework import serializers 
from .models import SegmentcliApi 

class SegmentcliApiSerializer(serializers.ModelSerializer):

    class Meta: 

        fields = (
            'request_id',
            'database',
            'created_at',
            'updated_at',    
        ) 

        model = SegmentcliApi

views.py

from rest_framework import generics 
from .models import SegmentcliApi
from .serializers import SegmentcliApiSerializer 

class SegmentcliApiList(generics.ListCreateAPIView):

    queryset = SegmentcliApi.objects.all() 
    serializer_class = SegmentcliApiSerializer 

class SegmentcliApiDetail(generics.RetrieveUpdateDestroyAPIView): 

    queryset = SegmentcliApi.objects.all() 
    serializer_class = SegmentcliApiSerializer

3 个答案:

答案 0 :(得分:1)

我建议开始研究Django Forms,尤其是Model Form,这就是我认为SegmentcliApiSerializer应该的样子。然后,我不确定如何将urls.py设置为可与您的应用一起使用,但是在您的模板中,表单将类似于:

<form action="{% url 'name_of_your_url_to_get_to_view_method' %}" method="POST">
    {% csrf_token %}
        {{ form }} 
    <button type="submit">BUTTON</button>
</form>

view.py将是这样的:

def yourViewMethod(request):
    if(request.method == "POST"):
        form = SegmentcliApiSerializer(request.POST)
        if(form.is_valid()):
            form.save()
            savedId = request.POST.get("request_id")
            return render(request, "yourFolder/yourHtmlFile.html", {"savedId": savedId})
    else:
        form = SegmentcliApiSerializer()
    return render(request, "yourFolder/yourHtmlFile.html", {"form": form})

然后,无论yourHtmlFile.html是什么,您都可以使用

{{ savedId }}

显示它的地方。我想这就是你要问的。

编辑:已修复,因此可以正确获取值。

答案 1 :(得分:1)

我无法发表评论,因为我没有足够的声誉,但是关于@marsonfire的答案,如果您只想使用简单的JSON响应,则可以使用JsonResponse而不是render

因此,您会遇到类似return JsonResponse({"savedId": savedId})

答案 2 :(得分:1)

在您的views.py中,更具体地说,在CreateApiViewListCreateApiView类中,您可以覆盖create方法,以便可以从发布请求中获得特定的响应

create方法来自CreateModelMixin类,该类由ListCreateAPIView继承,而该类又由您的特定Django模型继承。

因此,请按照以下步骤操作:

from rest_framework import status
from rest_framework.response import Response

class SegmentcliApiList(generics.ListCreateAPIView):

    queryset = SegmentcliApi.objects.all() 
    serializer_class = SegmentcliApiSerializer 

    def create(self, request, *args, **kwargs):

        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)

        # Original Response (inside the `CreateModelMixin` class)
        # return Response(
        #     serializer.data, 
        #     status=status.HTTP_201_CREATED, 
        #     headers=headers
        # )

        # We will replace the original response with this line 
        return Response(
            {'id': serializer.data.get('request_id')},
            status=status.HTTP_201_CREATED, 
            headers=headers
        )
        # serailizer.data is the created object in a JSON format 

这对我有用。如果对您不起作用,请告诉我您的评论。如果它适合您,请接受答案。