Django搭建个人博客:用户的删除

栏目: Python · 发布时间: 5年前

内容简介:删除用户数据本身的逻辑并不复杂,但是会涉及到新的问题。用户数据是很多网站最重要的财产,前面学习的用户登录、退出、创建都是相对安全的操作;而删除数据就很危险,弄不好会造成不可逆的损失。因此我们希望对操作者做一些限制,比如只能用户登录且必须是本用户才能进行删除的操作。这就是

删除用户数据本身的逻辑并不复杂,但是会涉及到新的问题。

用户数据是很多网站最重要的财产, 确保用户数据的安全是非常重要的

前面学习的用户登录、退出、创建都是相对安全的操作;而删除数据就很危险,弄不好会造成不可逆的损失。因此我们希望对操作者做一些限制,比如只能用户登录且必须是本用户才能进行删除的操作。这就是 权限

因此在视图中进行简单的用户权限的验证工作。编写 /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'),
]
复制代码

运行服务器看看效果。登录用户并在右上角下拉框中点击 删除用户

Django搭建个人博客:用户的删除

点击确定后就可以成功删除用户数据了。

检查数据库

前面我们已经讲过如何用SQLiteStudio查看数据库存储的内容,确保数据真正的从数据库中擦除了。

SQLiteStudio 打开项目中 db.sqlite3 文件,找到 auth_user 字段,显示如下:

Django搭建个人博客:用户的删除

可以看到 dusai123 这个用户确实已经没有了。

在验证操作数据的逻辑时, SQLiteStudio 可以帮助我们直观的发现问题,一定要善加利用。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Linux Command Line

The Linux Command Line

William E. Shotts Jr. / No Starch Press, Incorporated / 2012-1-17 / USD 39.95

You've experienced the shiny, point-and-click surface of your Linux computer-now dive below and explore its depths with the power of the command line. The Linux Command Line takes you from your very ......一起来看看 《The Linux Command Line》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具