为了账号安全,请及时绑定邮箱和手机立即绑定

异步长时间运行操作 API 调用

异步长时间运行操作 API 调用

慕容森 2023-08-15 17:16:06
我的 React 应用程序中有一个函数可以将数据发送到我的 Django API。一旦收到数据,django 就会调用外部 python 函数来执行一些代码。目前,我的 javascript 在收到响应时会发出警报ok。然而,在外部函数完成之前,Django 不会发送此响应;这是一个问题,因为根据用户的输入,外部函数可能需要长达一个小时的时间才能运行。是否可以将其更改为在外部 python 代码开始成功运行时发出一个警报,并在函数完成时发出第二次警报?我知道将数据发送到 API 时可能会失败,API 可能由于数据类型不匹配而无法访问数据,最后如果数据与外部函数不兼容。我正在寻找异步函数 React 的 3 种不同响应
查看完整描述

2 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

export const SendData = (url, props) =>{ //this url is the url to the DataInput api view

    const data1 = document.getElementById('data1')

    const data2 = document.getElementById('data2')


    async function postData() {

        var res = ''

        const options ={

            method : 'POST',

            headers: {

                'Accept': 'application/json',

                'Content-Type': 'application/json;charset=UTF-8'

            },

            body: JSON.stringify({

            data_one: data1,

            data_two: data2

            })

        }

        const response = await fetch(url, options)

            .then(response => {

                if (response.ok) {

                    alert("Data Sent!")

                }

                else {

                    alert("An error has occurred.\nWere all fields filled out?")

                }

            });

    }       

    postData()

};

models.py


class DataInput(models.Model):

    data_one = models.IntegerField(

        max_length=30,

        default=5)

    data_two = models.IntegerField(

        max_length=30,

        default=4)


class OtherData(models.Model):

    other_data = models.IntegerField(

        max_length=5,

        default=10)


@receiver(post_save, sender=DataInput, dispatch_uid="extra function")

def extra_function(sender, instance, created, *args, **kwargs):

    #dummy function to show reliance on data

    for i in OtherData[0].other_data:

        print(instance.data_two + instance.data_one)

serializer.py


from rest_framework import serializers

from .models import DataInput

from .models import OtherData

class DataSerializer(serilizers.ModelSerializer):

    class Meta:

        model = DataInput

        fields = ('data_one', 'data_two')

class OtherDataSerializer(serializer.ModelSerializer):

    class Meta:

        model = OtherData

        fields = ('other_data')


查看完整回答
反对 回复 2023-08-15
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

最好避免在同一 (http) 连接中同步等待长时间运行的操作的响应。特别是在浏览器中,因为它们可能会导致超时(取决于浏览器,但通常为 1-5 分钟)

解决方案之一是使用 HTTP 轮询。该技术的详细解释可以在这里找到:

  • 带轮询的长时间运行操作

  • 异步请求-应答模式

正如您在第二个链接中可以找到的,您的 API 应在开始长时间运行的流程之前验证请求和要执行的操作。如果请求无效,请立即回复错误代码,例如 HTTP 400(错误请求)。在其他情况下,将任务分配给后台工作人员(例如 django-q),并使用反应应用程序可以轮询等待作业结果的位置进行响应。


查看完整回答
反对 回复 2023-08-15
  • 2 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信