Django搭建個人部落格:使用者的刪除
刪除使用者資料本身的邏輯並不複雜,但是會涉及到新的問題。
使用者資料是很多網站最重要的財產, 確保使用者資料的安全是非常重要的 。
前面學習的使用者登入、退出、建立都是相對安全的操作;而刪除資料就很危險,弄不好會造成不可逆的損失。因此我們希望對操作者做一些限制,比如只能使用者登入且必須是本使用者才能進行刪除的操作。這就是 許可權 。
因此在檢視中進行簡單的使用者許可權的驗證工作。編寫 /userprofile/views.py
:
/userprofile/views.py from django.contrib.auth.models import User # 引入驗證登入的裝飾器 from django.contrib.auth.decorators import login_required ... @login_required(login_url='/userprofile/login/') def user_delete(request, id): user = User.objects.get(id=id) # 驗證登入使用者、待刪除使用者是否相同 if request.user == user: #退出登入,刪除資料並返回部落格列表 logout(request) user.delete() return redirect("article:article_list") else: return HttpResponse("你沒有刪除操作的許可權。") 複製程式碼
分析上面的程式碼:
-
@login_required
是一個 Python裝飾器 。裝飾器可以在不改變某個函式內容的前提下,給這個函式新增一些功能。具體來說就是@login_required
要求呼叫user_delete()
函式時,使用者必須登入;如果未登入則不執行函式,將頁面重定向到/userprofile/login/
地址去。- 裝飾器的詳細解釋可以看這裡: ofollow,noindex">如何理解Python裝飾器?
-
@login_required
的詳細解釋看這裡:login_required
-
裝飾器確認使用者已經登入後,允許呼叫
user_delete()
;然後需要刪除的使用者 id 通過請求傳遞到檢視中,由if
語句確認是否與登入的使用者一致,成功後則退出登入並刪除使用者資料,返回部落格列表頁面。
模板與url
然後改寫 /templates/header.html
,新增了 刪除使用者 的入口,並且在末尾新增 彈窗元件 的程式碼:
/templates/header.html ... <div class="dropdown-menu" aria-labelledby="navbarDropdown"> <!-- 新增 --> <a class="dropdown-item" href="#" onclick="user_delete()">刪除使用者</a> <a class="dropdown-item" href='{% url "userprofile:logout" %}'>退出登入</a> </div> ... <!-- 新增 --> {% if user.is_authenticated %} <script> function user_delete() { // 呼叫layer彈窗元件 layer.open({ title: "確認刪除", content: "確認刪除使用者資料嗎?", yes: function(index, layero) { location.href='{% url "userprofile:delete" user.id %}' }, }) } </script> {% endif %} 複製程式碼
- 因為刪除使用者要求使用者必須登入,因此就把它的入口放在登陸後才顯示的下拉框中,這樣頁面可以更加簡潔。當然這種方式並不是最佳的選擇,通常的做法是把刪除功能放在獨立的使用者資料頁面中。
- 與刪除文章類似,點選 刪除使用者 連結後呼叫了
user_delete()
函式,函式包含了 彈窗元件 確認使用者沒有誤操作;點選彈窗中的確認按鈕後,呼叫刪除的檢視,執行業務邏輯。 - 注意到
user_delete()
函式是用if
模板語句包裹起來的。因為使用者未登入時頁面物件中是沒有user.id
屬性的,但是函式中卻又包含了user.id
,Django在解析模板時就會報錯。if
語句確保了 只有在使用者登入時才對這段JavaScript程式碼進行解析 ,迴避了這個問題。 - 我們在
base.html
已經引用了 彈窗元件模組 ,而header.html
是拼接在base.html
中的,因此就不用再重複引用彈窗元件了。
最後就是寫好 /userprofile/urls.py
的路由映射了:
/userprofile/urls.py urlpatterns = [ ... # 使用者刪除 path('delete/<int:id>/', views.user_delete, name='delete'), ] 複製程式碼
執行伺服器看看效果。登入使用者並在右上角下拉框中點選 刪除使用者 :

點選確定後就可以成功刪除使用者資料了。
檢查資料庫
前面我們已經講過如何用SQLiteStudio檢視資料庫儲存的內容,確保資料真正的從資料庫中擦除了。
用 SQLiteStudio 開啟專案中 db.sqlite3
檔案,找到 auth_user
欄位,顯示如下:

可以看到 dusai123
這個使用者確實已經沒有了。
在驗證操作資料的邏輯時, SQLiteStudio 可以幫助我們直觀的發現問題,一定要善加利用。