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

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

在 iOS 設備上發出 POST 請求后保持相同的網頁(Django 發送 204 狀態響應)

在 iOS 設備上發出 POST 請求后保持相同的網頁(Django 發送 204 狀態響應)

慕婉清6462132 2023-10-17 19:57:59
我的 Django 項目在網頁上有許多按鈕,它們向主程序發送 POST 請求,主程序view.py依次處理操作并返回204 No content響應。操作的結果稍后會異步顯示在網頁上(生成響應時,沒有任何新內容可顯示)。在任何基于非 iOS 的瀏覽器上,204 響應都可以正常工作,并且網頁保留在瀏覽器中,正如RFC 7231所期望的那樣。不幸的是,我嘗試過的所有基于 iOS 的瀏覽器(Safari、Firefox、Chrome)都會在 POST 后導航到空白頁面,這不是我想要的(請參閱此問題)。顯然這是WebKit 中長期存在的錯誤。有什么方法可以在所有瀏覽器上實現相同的效果嗎?IE。單擊按鈕,POST,網頁保持原樣,更改稍后出現。我看過這個,但不確定這真的是我想要的。更改響應代碼是可能的,但我沒有看到不離開當前頁面的可行替代方案。我目前的黑客修復是為 iOS 設備重新加載整個頁面,但是如果用戶之前向下滾動,這會移動頁面,所以看起來很卡頓。
查看完整描述

1 回答

?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

event.preventDefault()?簡短的答案是在您自己的函數中為每個表單覆蓋常規表單提交onsubmit。然后使用 JQuery 異步執行 POST。這避免了服務器必須返回狀態為 204 的 HttpResponse,或者除了空的 JsonResponse 之外的任何其他內容。

我的網頁上有多個表單,因此我沒有為每個按鈕分配單個功能,如上面鏈接的答案中所示,但有幾個可以更改單個按鈕的行為。另外,對于 Django,還需要考慮在 POST 請求中包含 CSRF 令牌。

例如,一些帶有兩個按鈕的 html;

<form id="form-a" onsubmit="submit_form_a(event)">{% csrf_token %}

? ? <input type="hidden" name="button-a" value="some_value_for_a">

? ? <button type="submit" class="w3-button">Button A</button>

</form>


<form id="form-z" onsubmit="submit_form_z(event)">{% csrf_token %}

? ? <input type="hidden" name="button-z" value="some_value_for_z">

? ? <button type="submit" class="w3-button">Button Z</button>

</form>

然后是 Javascript,例如,第一個表單提交回調禁用按鈕;


function submit_form_a(e){

? ? e.preventDefault();

? ? var url = "/main/a"

? ? var formData = $(e.target).serialize();

? ? var btn = $(e.target).find("button");

? ? btn.prop("disabled", true);

? ? myPost(url, formData);

}

第二個提交回調使用優秀的W3.CSS執行一些動畫;


function submit_form_z(e){

? ?e.preventDefault();

? ?var url = "/main/z"

? ?var formData = $(e.target).serialize();

? ?var btn = $(e.target).find("button");

? ?btn.toggleClass("w3-animate-fading").toggleClass("w3-text-red")

? ?myPost(url, formData);

}

這兩個腳本都調用一個通用腳本mypost,該腳本使用 CSRF 令牌設置 XMLHttpResponse 標頭,然后將其發布;


// Make sure any AJAX POST requests are not going off-site. Prevents

// leaking the CSRF token.


function csrfSafeMethod(method) {

// these HTTP methods do not require CSRF protection

? ? return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); }?


function myPost(url, data) {

? ? var csrftoken = $("[name=csrfmiddlewaretoken]").val();

? ? // Set the header on the AJAX POST request with the CSRF token

? ? $.ajaxSetup({beforeSend: function(xhr, settings) {

? ? ? ? if (!csrfSafeMethod(settings.type) && !this.crossDomain) {

? ? ? ? ? ? xhr.setRequestHeader("X-CSRFToken", csrftoken);

? ? ? ? }

? ? }});

? ? $.post(url, data);

}

回到 Djangoviews.py方面,查看<input>表單中的數據并執行您需要執行的操作。我剛剛發現 iOS 上的按鈕本身并不包含在 POST 表單數據中,就像其他平臺上的那樣,因此需要隱藏的文本輸入元素;


if request.is_ajax() and request.method == 'POST':

? ? if 'button-a' in request.POST:

? ? ? ? # do something for A

? ? elif 'button-z' in request.POST:

? ? ? # do something for Z

? ? return JsonResponse({})

瞧!可以單擊按鈕,發生背景操作,并且頁面不會移動。您可以返回除空 JSON 響應之外的其他內容,并在表單回調中處理它,例如重新啟用按鈕,但我不需要這樣做。有關詳細信息,請參閱之前鏈接的答案。


查看完整回答
反對 回復 2023-10-17
  • 1 回答
  • 0 關注
  • 119 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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