django - 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)
为什么会这样?如何确保第二个补丁不会发生在第一个补丁的中间?
解决方案
您无法在服务器端控制这一点,即使您在发送另一个请求后发送一个请求,您也无法控制哪个将首先执行。它们取决于很多东西,包括它们在服务器机器上分配给哪个进程、包通过的网络路径等。
如果要确保在另一个请求完成后发送请求,则需要在客户端确保这一点。类似于以下内容,使用 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) {
...
}
});
推荐阅读
- groovy - 如何在没有 JAR 的其他包中使用 Groovy 类?
- javascript - 如何使用 Javascript 将数字动态添加到第一个单元格
- c - 输入 1 - 10 的数字时,左旋转在最后一点在 AVL 树中失败
- python - 如何从用户那里获取输入并将它们保存在列表中(Python Kivy)?
- mpi - Openmpi 设置 btl 标志 --mca btl tcp 与 --mca btl_tcp_if_include eth1
- javascript - 在 catch 语句中没有提升?
- php - 为什么表中的插值重复不适用于 symfony 形式?
- ios - 将字符串除以一个数字
- amazon-web-services - Lambda@Edge 未设置 cookie 作为响应
- d3.js - Interactive chart Library for web browser supporting click and drag of points