Django使用AJAX向服務(wù)器發(fā)起請(qǐng)求的操作方法
什么是AJAX?
AJAX(Asynchronous JavaScript and XML)是一種用于創(chuàng)建交互式網(wǎng)頁(yè)應(yīng)用程序的技術(shù),它允許在不重新加載整個(gè)頁(yè)面的情況下向服務(wù)器發(fā)送和接收數(shù)據(jù)。通過(guò) AJAX,網(wǎng)頁(yè)可以異步地向服務(wù)器發(fā)起請(qǐng)求并在后臺(tái)進(jìn)行處理,然后在不刷新頁(yè)面的情況下更新頁(yè)面的部分內(nèi)容。
具體來(lái)說(shuō),AJAX 主要由以下幾個(gè)核心技術(shù)組成:
- JavaScript:AJAX 的核心是 JavaScript,它負(fù)責(zé)在客戶端(瀏覽器)發(fā)起請(qǐng)求、處理響應(yīng),并更新頁(yè)面的內(nèi)容。
- XMLHttpRequest對(duì)象(XHR):XHR 是在 JavaScript 中用于向服務(wù)器發(fā)起 HTTP 請(qǐng)求和接收響應(yīng)的對(duì)象。通過(guò) XHR,JavaScript 可以在后臺(tái)與服務(wù)器進(jìn)行通信,獲取數(shù)據(jù)并更新頁(yè)面。
- HTML(或XML):通常情況下,服務(wù)器響應(yīng)會(huì)以 HTML 或 XML 格式返回?cái)?shù)據(jù)。HTML 格式的響應(yīng)可以直接用于更新頁(yè)面的內(nèi)容,而 XML 格式的響應(yīng)通常需要 JavaScript 進(jìn)行解析后再進(jìn)行處理。
- CSS:有時(shí)候,也會(huì)使用 CSS 來(lái)實(shí)現(xiàn)頁(yè)面的動(dòng)態(tài)效果,以增強(qiáng)用戶體驗(yàn)。
AJAX 技術(shù)的主要優(yōu)點(diǎn)包括:
- 提升用戶體驗(yàn):通過(guò)異步加載數(shù)據(jù),可以減少頁(yè)面的加載時(shí)間和帶寬消耗,從而提升用戶體驗(yàn)。
- 減少服務(wù)器負(fù)載:不需要重新加載整個(gè)頁(yè)面,可以減少服務(wù)器的請(qǐng)求量,降低服務(wù)器負(fù)載。
- 增強(qiáng)頁(yè)面交互性:可以在不刷新整個(gè)頁(yè)面的情況下動(dòng)態(tài)地更新頁(yè)面的部分內(nèi)容,增強(qiáng)了頁(yè)面的交互性和實(shí)時(shí)性。
總的來(lái)說(shuō),AJAX 技術(shù)使得網(wǎng)頁(yè)能夠更快速、更動(dòng)態(tài)地與用戶交互,為用戶提供更加流暢和友好的使用體驗(yàn)。
實(shí)例
在網(wǎng)頁(yè)頁(yè)面有一個(gè)信息列表,點(diǎn)擊列表中的編輯圖標(biāo)后,向服務(wù)器發(fā)送請(qǐng)求,由視圖函數(shù)處理后,更新數(shù)據(jù)庫(kù)記錄,并且刷新頁(yè)面。
1、html文件,及其中的腳本語(yǔ)言如下:
<table class="table table-hover"> <tr> <td>序號(hào)</td> <td>欄目名稱</td> <td>操作</td> </tr> {% for column in columns %} <tr> <td>{{ forloop.counter }}</td> <td>{{ column.column }}</td> <td> <a name="edit" href="javascript:" rel="external nofollow" rel="external nofollow" onclick="edit_column(this, {{ column.id }})"> <span class="fas fa-pencil-alt"></span> </a> <a name="delete" href="javascript:" rel="external nofollow" rel="external nofollow" onclick="del_column(this, {{ column.id }})"> <span class="fas fa-trash-alt" style="margin-left: 20px;"></span> </a> </td> </tr> {% empty %} <p>還沒(méi)有設(shè)置欄目,太懶了。</p> {% endfor %} </table>
<script> function edit_column(element, columnId) { // 獲取當(dāng)前行的文檔名稱單元格 const currentRow = element.closest('tr'); const nameCell = currentRow.querySelector('td:nth-child(2)'); // 獲取當(dāng)前文檔名稱 const currentName = nameCell.textContent; // 彈出 Prompt 對(duì)話框,獲取新的文檔名稱 const newName = prompt('請(qǐng)輸入新的欄目名稱:', currentName); // 如果用戶點(diǎn)擊了確定并輸入了新名稱,更新表格中的文檔名稱 if (newName !== null && newName.trim() !== '') { const trimmedName = newName.trim(); // 發(fā)送 AJAX 請(qǐng)求更新數(shù)據(jù)庫(kù),在fetch后支出了提交的url,由該url確定由那個(gè)view函數(shù)處理提交 fetch(`/article/update-column/`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRFToken': getCookie('csrftoken') // Django 的 CSRF token }, body: JSON.stringify({ current_name: currentName, new_name: trimmedName }) //發(fā)送到后臺(tái)的是一個(gè)字典,鍵current_name值是column的舊名稱,鍵new_name值是column的新名稱 }).then(response => { if (response.ok) { // 更新成功,更新表格中的文檔名稱 nameCell.textContent = trimmedName; alert('欄目名稱更新成功'); } else { // 更新失敗,處理錯(cuò)誤 alert('更新失敗,請(qǐng)重試'); } }).catch(error => { console.error('Error:', error); alert('更新失敗,請(qǐng)重試'); }); } } function del_column(element, columnId) { // 實(shí)現(xiàn)刪除功能的邏輯 console.log('刪除欄目 ID:', columnId); } // 獲取 CSRF token 的函數(shù)(Django) function getCookie(name) { let cookieValue = null; if (document.cookie && document.cookie !== '') { const cookies = document.cookie.split(';'); for (let i = 0; i < cookies.length; i++) { const cookie = cookies[i].trim(); if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } </script>
2、view函數(shù)如下
@csrf_exempt @login_required def update_column(request): if request.method == 'POST': try: data = json.loads(request.body) current_name = data.get('current_name') #提交數(shù)據(jù)字典中的current_name new_name = data.get('new_name') #提交數(shù)據(jù)字典中的new_name changed_column = ArticleColumn.objects.get(user = request.user, column=current_name) changed_column.column = new_name changed_column.save() return JsonResponse({'status': 'success'}) except ArticleColumn.DoesNotExist: return JsonResponse({'status': 'error', 'message': 'ArticleColumn not found'}, status=404) except Exception as e: return JsonResponse({'status': 'error', 'message': str(e)}, status=500) return JsonResponse({'status': 'error', 'message': 'Invalid request method'}, status=400)
3、url如下
path('update-column/', views.update_column, name='update_column'),
到此這篇關(guān)于Django使用AJAX向服務(wù)器發(fā)起請(qǐng)求的文章就介紹到這了,更多相關(guān)Django服務(wù)器發(fā)起請(qǐng)求內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ajax獲得json對(duì)象數(shù)組 循環(huán)輸出數(shù)據(jù)的方法
今天小編就為大家分享一篇ajax獲得json對(duì)象數(shù)組 循環(huán)輸出數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Ajax+Asp源代碼]讀取數(shù)據(jù)庫(kù)內(nèi)容的表格(沒(méi)有用框架)
Ajax+Asp源代碼]讀取數(shù)據(jù)庫(kù)內(nèi)容的表格(沒(méi)有用框架)...2006-11-11JavaScript如何控制Session實(shí)現(xiàn)原理及代碼
看到這個(gè)題目,或許有人會(huì)提出疑問(wèn),JavaScript代表客戶端,而Session代表的是服務(wù)器(不知道這樣說(shuō)大家是否能夠理解)現(xiàn)在就回到了題目所描述的問(wèn)題寫一個(gè)JavaScript方法,使其修改Session,感興趣的朋友可以了解下,或許本文對(duì)你學(xué)習(xí)ajax有所幫助2013-02-02ajax三級(jí)聯(lián)動(dòng)的實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了ajax三級(jí)聯(lián)動(dòng)的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03pushState實(shí)現(xiàn)Ajax無(wú)刷新頁(yè)面切換
這篇文章主要介紹了pushState實(shí)現(xiàn)Ajax無(wú)刷新頁(yè)面切換的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Ajax實(shí)現(xiàn)頁(yè)面無(wú)刷新留言效果
這篇文章主要為大家詳細(xì)介紹了Ajax實(shí)現(xiàn)頁(yè)面無(wú)刷新留言效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12AJAX淺析數(shù)據(jù)交換的實(shí)現(xiàn)
在AJAX中,最常用的就是JSON,XML因?yàn)楸容^冗雜所以用的比較少。所以我們先來(lái)說(shuō)基于JSON的數(shù)據(jù)交換。最后我們還會(huì)提到在數(shù)據(jù)交換中出現(xiàn)亂碼的形式2022-08-08HTTP狀態(tài)代碼及其定義解析 Ajax捕捉回調(diào)錯(cuò)誤參考
當(dāng)用戶試圖通過(guò) HTTP 訪問(wèn)一臺(tái)正在運(yùn)行 Internet 信息服務(wù) (IIS) 的服務(wù)器上的內(nèi)容時(shí),IIS 返回一個(gè)表示該請(qǐng)求的狀態(tài)的數(shù)字代碼。狀態(tài)代碼可以指明具體請(qǐng)求是否已成功,還可以揭示請(qǐng)求失敗的確切原因2013-11-11AJAX入門之深入理解JavaScript中的函數(shù)
AJAX入門之深入理解JavaScript中的函數(shù)...2007-02-02