亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

異步長時間運行操作 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 關注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號