Django在返回第一个请求之前执行第二个请求
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django在返回第一个请求之前执行第二个请求相关的知识,希望对你有一定的参考价值。
我一个接一个地从前端向Django发送两个PATCH查询。两个查询都到达相同的django REST框架端点(见下文)。
我的问题是事情发生的顺序。以下代码给了我这个印刷品:
FIRST PATCH: clearing
SECOND PATCH HAPPENING
FIRST PATCH: after adding references
如您所见,第二个补丁正在第一个补丁的中间执行。这导致它返回一个实例,其中引用字段为空,因为它尚未重新填充。
def partial_update(self, request, pk=None, *args, **kwargs):
if 'height' in data or 'pos_x' in data:
# do something
print("SECOND PATCH HAPPENING")
return super(NodeViewSet, self).partial_update(request, *args, **kwargs)
reference_ids = request.data.get('references', None)
if reference_ids is not None:
references = Node.objects.filter(pk__in=reference_ids)
instance = self.get_object()
print("FIRST PATCH: clearing")
instance.references.clear()
instance.references.add(*references)
print("FIRST PATCH: after adding references")
return super(NodeViewSet, self).partial_update(request, *args, **kwargs)
为什么会这样?如何确保第二个PATCH不会在第一个PATCH中间发生?
答案
您无法在服务器端控制此项,即使您在发送另一个请求后发送请求,也无法控制先执行哪个请求。它们取决于许多因素,包括它们在服务器计算机上分配的进程,包行进的网络路径等。
如果要确保在另一个请求完成后发送请求,则需要在客户端确保该请求。使用jquery ajax,如下所示:
$.ajax({
url : 'url',
type : 'PATCH',
data : data,
success : function(response, textStatus, jqXhr) {
// Issue the second request here, after the first one is completed successfully
$.ajax({
url : 'url',
type : 'PATCH',
data : data,
success: function(response, textStatus, jqXhr) {
// Both requests succeeded here, issued sequentially
}
}
},
error : function(jqXHR, textStatus, errorThrown) {
...
}
});
以上是关于Django在返回第一个请求之前执行第二个请求的主要内容,如果未能解决你的问题,请参考以下文章