【问题标题】:Asynchronous long-running operation API call异步长时间运行的操作 API 调用
【发布时间】:2023-03-27 12:24:01
【问题描述】:

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

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

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

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')

【问题讨论】:

    标签: python reactjs django async-await


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-12
      相关资源
      最近更新 更多