首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >异步长时间运行操作API调用

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

Stack Overflow用户
提问于 2020-09-16 23:09:18
回答 1查看 969关注 0票数 1

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
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')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-17 00:23:29

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

它使用HTTP轮询的解决方案之一。有关这项技术的很好的解释可以在这里找到:

正如您在第二个链接中所发现的,您的API应该在启动长时间运行的过程之前,同时验证请求和要执行的操作。如果请求无效,请立即使用错误代码(如HTTP 400 (坏请求)进行答复)。在其他情况下,将任务交给后台工作人员(例如django-q),带有响应应用程序的位置的响应可以轮询等待作业结果。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63929084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档