這一章將實現刪除用戶數據的功能。
權限與視圖
刪除用戶數據本身的邏輯並不複雜,但是會涉及到新的問題。
用戶數據是很多網站最重要的財產,確保用戶數據的安全是非常重要的。
前面學習的用戶登錄、退出、創建都是相對安全的操作;而刪除數據就很危險,弄不好會造成不可逆的損失。因此我們希望對操作者做一些限制,比如只能用戶登錄且必須是本用戶才能進行刪除的操作。這就是權限。
因此在視圖中進行簡單的用戶權限的驗證工作。編寫/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/
地址去。- 裝飾器的詳細解釋可以看這裏:如何理解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可以幫助我們直觀的發現問題,一定要善加利用。
總結
本章學習了刪除用戶功能,並給它賦予了簡單的權限。
下一章將學習通過郵箱重置用戶密碼。
- 有疑問請在杜賽的個人網站留言,我會盡快回復。
- 或Email私信我:[email protected]
- 項目完整代碼:Django_blog_tutorial
轉載請告知作者並註明出處。