Django使用AJAX向服務(wù)器發(fā)起請求的操作方法
什么是AJAX?
AJAX(Asynchronous JavaScript and XML)是一種用于創(chuàng)建交互式網(wǎng)頁應(yīng)用程序的技術(shù),它允許在不重新加載整個頁面的情況下向服務(wù)器發(fā)送和接收數(shù)據(jù)。通過 AJAX,網(wǎng)頁可以異步地向服務(wù)器發(fā)起請求并在后臺進行處理,然后在不刷新頁面的情況下更新頁面的部分內(nèi)容。
具體來說,AJAX 主要由以下幾個核心技術(shù)組成:
- JavaScript:AJAX 的核心是 JavaScript,它負責(zé)在客戶端(瀏覽器)發(fā)起請求、處理響應(yīng),并更新頁面的內(nèi)容。
- XMLHttpRequest對象(XHR):XHR 是在 JavaScript 中用于向服務(wù)器發(fā)起 HTTP 請求和接收響應(yīng)的對象。通過 XHR,JavaScript 可以在后臺與服務(wù)器進行通信,獲取數(shù)據(jù)并更新頁面。
- HTML(或XML):通常情況下,服務(wù)器響應(yīng)會以 HTML 或 XML 格式返回數(shù)據(jù)。HTML 格式的響應(yīng)可以直接用于更新頁面的內(nèi)容,而 XML 格式的響應(yīng)通常需要 JavaScript 進行解析后再進行處理。
- CSS:有時候,也會使用 CSS 來實現(xiàn)頁面的動態(tài)效果,以增強用戶體驗。
AJAX 技術(shù)的主要優(yōu)點包括:
- 提升用戶體驗:通過異步加載數(shù)據(jù),可以減少頁面的加載時間和帶寬消耗,從而提升用戶體驗。
- 減少服務(wù)器負載:不需要重新加載整個頁面,可以減少服務(wù)器的請求量,降低服務(wù)器負載。
- 增強頁面交互性:可以在不刷新整個頁面的情況下動態(tài)地更新頁面的部分內(nèi)容,增強了頁面的交互性和實時性。
總的來說,AJAX 技術(shù)使得網(wǎng)頁能夠更快速、更動態(tài)地與用戶交互,為用戶提供更加流暢和友好的使用體驗。
實例
在網(wǎng)頁頁面有一個信息列表,點擊列表中的編輯圖標(biāo)后,向服務(wù)器發(fā)送請求,由視圖函數(shù)處理后,更新數(shù)據(jù)庫記錄,并且刷新頁面。
1、html文件,及其中的腳本語言如下:
<table class="table table-hover"> <tr> <td>序號</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>還沒有設(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 對話框,獲取新的文檔名稱 const newName = prompt('請輸入新的欄目名稱:', currentName); // 如果用戶點擊了確定并輸入了新名稱,更新表格中的文檔名稱 if (newName !== null && newName.trim() !== '') { const trimmedName = newName.trim(); // 發(fā)送 AJAX 請求更新數(shù)據(jù)庫,在fetch后支出了提交的url,由該url確定由那個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ā)送到后臺的是一個字典,鍵current_name值是column的舊名稱,鍵new_name值是column的新名稱 }).then(response => { if (response.ok) { // 更新成功,更新表格中的文檔名稱 nameCell.textContent = trimmedName; alert('欄目名稱更新成功'); } else { // 更新失敗,處理錯誤 alert('更新失敗,請重試'); } }).catch(error => { console.error('Error:', error); alert('更新失敗,請重試'); }); } } function del_column(element, columnId) { // 實現(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ā)起請求的文章就介紹到這了,更多相關(guān)Django服務(wù)器發(fā)起請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ajax獲得json對象數(shù)組 循環(huán)輸出數(shù)據(jù)的方法
今天小編就為大家分享一篇ajax獲得json對象數(shù)組 循環(huán)輸出數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08Ajax+Asp源代碼]讀取數(shù)據(jù)庫內(nèi)容的表格(沒有用框架)
Ajax+Asp源代碼]讀取數(shù)據(jù)庫內(nèi)容的表格(沒有用框架)...2006-11-11JavaScript如何控制Session實現(xiàn)原理及代碼
看到這個題目,或許有人會提出疑問,JavaScript代表客戶端,而Session代表的是服務(wù)器(不知道這樣說大家是否能夠理解)現(xiàn)在就回到了題目所描述的問題寫一個JavaScript方法,使其修改Session,感興趣的朋友可以了解下,或許本文對你學(xué)習(xí)ajax有所幫助2013-02-02HTTP狀態(tài)代碼及其定義解析 Ajax捕捉回調(diào)錯誤參考
當(dāng)用戶試圖通過 HTTP 訪問一臺正在運行 Internet 信息服務(wù) (IIS) 的服務(wù)器上的內(nèi)容時,IIS 返回一個表示該請求的狀態(tài)的數(shù)字代碼。狀態(tài)代碼可以指明具體請求是否已成功,還可以揭示請求失敗的確切原因2013-11-11AJAX入門之深入理解JavaScript中的函數(shù)
AJAX入門之深入理解JavaScript中的函數(shù)...2007-02-02