Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python (Django)将POST ID发送回客户端_Python_Django_Django Rest Framework - Fatal编程技术网

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

Python (Django)将POST ID发送回客户端,python,django,django-rest-framework,Python,Django,Django Rest Framework,我是Django的新手,我正在尝试创建一个基本的API。但是有一件事一直困扰着我,那就是如何在某些(异步)事件发生时创建回调函数 例如,我的一个最简单的例子是当客户端发送POST请求时。我想将DB中该请求的ID发回给他。我该怎么做 我的代码主要遵循William S.Vincent的书,稍作修改 最重要的部分是: models.py: 来自django.db导入模型的 类片段CliAPI(models.Model): 请求\u id=models.AutoField(主键=True) 数据库=m

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

例如,我的一个最简单的例子是当客户端发送POST请求时。我想将DB中该请求的ID发回给他。我该怎么做

我的代码主要遵循William S.Vincent的书,稍作修改

最重要的部分是:

models.py

来自django.db导入模型的

类片段CliAPI(models.Model):
请求\u id=models.AutoField(主键=True)
数据库=models.CharField(最大长度=100)
已创建\u at=models.DateTimeField(自动\u now\u add=True)
更新的\u at=models.DateTimeField(自动\u now=True)
定义(自我):
将f'DB请求返回到{self.database}:在{self.created_at}创建'
serializers.py

从rest\u框架导入序列化程序
从.models导入片段cliapi
类SegmentcliApiSerializer(serializers.ModelSerializer):
类元:
字段=(
“请求_id”,
“数据库”,
“创建于”,
“更新地址”,
) 
模型=分段cliapi
views.py

从rest\u框架导入泛型
从.models导入片段cliapi
从.serializers导入SegmentcliApiSerializer
类SegmentcliApiList(generics.ListCreateAPIView):
queryset=SegmentcliApi.objects.all()
serializer_class=SegmentcliApiSerializer
类SegmentcliApiDetail(generics.RetrieveUpdatedStroyapiView):
queryset=SegmentcliApi.objects.all()
serializer_class=SegmentcliApiSerializer

我建议开始具体研究一下,我认为
SegmentcliApiSerializer
应该是什么。然后,我不确定您的
urls.py
是如何设置为与应用程序一起使用的,但在您的模板中,表单类似于:


{%csrf_令牌%}
{{form}}
按钮
view.py
应该是这样的:

def yourViewMethod(请求):
如果(request.method==“POST”):
form=SegmentcliApiSerializer(request.POST)
如果(form.is_valid()):
form.save()
savedId=request.POST.get(“request\u id”)
返回呈现(请求“yourFolder/yourHtmlFile.html”{“savedId”:savedId})
其他:
form=SegmentcliApiSerializer()
返回呈现(请求“yourFolder/yourHtmlFile.html”,{“form”:form})
然后,无论您的htmlfile.html是什么,您都可以使用

{{ savedId }}
在某个地方展示它。我想这就是你要问的


编辑:已修复,因此它获得了正确的值。

我无法评论,因为我没有足够的声誉,但是,关于@marsonfire的答案,如果您只想得到简单的JSON响应,可以使用它而不是
渲染


因此,在
视图.py
中有类似
return JsonResponse({“savedId”:savedId})
的内容,更具体地说,在
createapiew
listcreateapiew
类中,可以重写
create
方法,以便从post请求中获得特定的响应

create
方法来自
CreateModelMixin
类,该类由
ListCreateAPIView
继承,然后由特定的Django模型继承

因此,请遵循以下步骤:

来自rest\u框架导入状态
来自rest\u framework.response导入响应
类SegmentcliApiList(generics.ListCreateAPIView):
queryset=SegmentcliApi.objects.all()
serializer_class=SegmentcliApiSerializer
def创建(self、request、*args、**kwargs):
serializer=self.get\u序列化程序(data=request.data)
serializer.is\u有效(raise\u exception=True)
self.perform\u创建(序列化程序)
headers=self.get\u success\u头(serializer.data)
#原始响应(在`CreateModelMixin`类中)
#返回响应(
#serializer.data,
#status=status.HTTP_201_已创建,
#标题=标题
# )
#我们将用这一行替换原始响应
返回响应(
{'id':serializer.data.get('request_id')},
status=status.HTTP_201_已创建,
标题=标题
)
#serailizer.data是以JSON格式创建的对象

这对我有用。如果它不适合你,告诉我你在评论中得到了什么。如果它对您有效,请接受答案。

我不知道我所说的是否是您所想的,但我希望这个过程是自动化的,而不是真正将任何内容放在HTML文件中。相反,我希望API向客户端返回一条简单的文本或JSON消息(如ACK消息)。我想我还是可以按照你的建议来做,因为我只需要解析HTML并在格式化文本中找到ID,但我认为这可能比这更简单。我没有使用Django和JSON做任何事情,所以我帮不了什么忙,但是我认为并且可能有助于@Philippefanaro,迄今为止我能够绕过这个问题的方法是
curl-I-d“database=caedu5”http://localhost:8000/segmentcli_api/v1/
,然后使用重定向(例如
>tmp/log.txt
)并解析日志文件中的帖子ID。如果每次在数据库中创建一个新项目时我都能运行这样的程序,那就太完美了。内容不错。现在,我终于(或多或少)理解了Django类中是如何继承的。顺便问一下,Django库是否有类继承的UML fluxogram,这将非常有帮助。如果它不存在,他们应该生成一个,它甚至可以是自动的