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



我的react应用程序中有一个函数,它将数据发送到Django API。一旦收到这些数据,django就会调用一个外部python函数来执行一些代码。

目前,当javascript收到ok响应时,它会向我发出警报。然而,Django在外部函数完成之前不会发送此响应;这是一个问题,因为根据用户的输入运行外部函数可能需要长达一个小时。一旦外部python代码开始成功运行,是否可以将其更改为发出一次警报,并在函数完成时发出第二次警报?

我理解它们在将数据发送到API时可能会失败,API可能因为数据类型不匹配而无法访问数据,最后如果数据与外部函数不兼容。我正在从异步函数中寻找3种不同的响应React

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()
};

型号.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')

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

其中一个解决方案是使用HTTP轮询。这里可以很好地解释这种技术:

  • 带轮询的长时间运行操作
  • 异步请求-答复模式

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

最新更新