首页 > 解决方案 > 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)

为什么会这样?如何确保第二个补丁不会发生在第一个补丁的中间?

标签: djangodjango-rest-framework

解决方案


您无法在服务器端控制这一点,即使您在发送另一个请求后发送一个请求,您也无法控制哪个将首先执行。它们取决于很多东西,包括它们在服务器机器上分配给哪个进程、包通过的网络路径等。

如果要确保在另一个请求完成后发送请求,则需要在客户端确保这一点。类似于以下内容,使用 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) {
            ...
        }
});

推荐阅读