Django搭建我的博客:用戶的刪除

這一章將實現刪除用戶數據的功能。html

權限與視圖

刪除用戶數據自己的邏輯並不複雜,可是會涉及到新的問題。python

用戶數據是不少網站最重要的財產,確保用戶數據的安全是很是重要的git

前面學習的用戶登陸、退出、建立都是相對安全的操做;而刪除數據就很危險,弄很差會形成不可逆的損失。所以咱們但願對操做者作一些限制,好比只能用戶登陸且必須是本用戶才能進行刪除的操做。這就是權限github

所以在視圖中進行簡單的用戶權限的驗證工做。編寫/userprofile/views.pysql

/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/地址去。django

  • 裝飾器確認用戶已經登陸後,容許調用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能夠幫助咱們直觀的發現問題,必定要善加利用。

總結

本章學習了刪除用戶功能,並給它賦予了簡單的權限。

下一章將學習經過郵箱重置用戶密碼。

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

相關文章
相關標籤/搜索