Django搭建個人部落格:使用者的刪除

杜賽_dusai發表於2019-02-26

這一章將實現刪除使用者資料的功能。

許可權與檢視

刪除使用者資料本身的邏輯並不複雜,但是會涉及到新的問題。

使用者資料是很多網站最重要的財產,確保使用者資料的安全是非常重要的

前面學習的使用者登入、退出、建立都是相對安全的操作;而刪除資料就很危險,弄不好會造成不可逆的損失。因此我們希望對操作者做一些限制,比如只能使用者登入且必須是本使用者才能進行刪除的操作。這就是許可權

因此在檢視中進行簡單的使用者許可權的驗證工作。編寫/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/地址去。

  • 裝飾器確認使用者已經登入後,允許呼叫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`),
]
複製程式碼

執行伺服器看看效果。登入使用者並在右上角下拉框中點選刪除使用者

Django搭建個人部落格:使用者的刪除

點選確定後就可以成功刪除使用者資料了。

檢查資料庫

前面我們已經講過如何用SQLiteStudio檢視資料庫儲存的內容,確保資料真正的從資料庫中擦除了。

SQLiteStudio開啟專案中db.sqlite3檔案,找到auth_user欄位,顯示如下:

Django搭建個人部落格:使用者的刪除

可以看到dusai123這個使用者確實已經沒有了。

在驗證運算元據的邏輯時,SQLiteStudio可以幫助我們直觀的發現問題,一定要善加利用。

總結

本章學習了刪除使用者功能,並給它賦予了簡單的許可權。

下一章將學習通過郵箱重置使用者密碼。

轉載請告知作者並註明出處。

相關文章