内容简介:删除用户数据本身的逻辑并不复杂,但是会涉及到新的问题。用户数据是很多网站最重要的财产,前面学习的用户登录、退出、创建都是相对安全的操作;而删除数据就很危险,弄不好会造成不可逆的损失。因此我们希望对操作者做一些限制,比如只能用户登录且必须是本用户才能进行删除的操作。这就是
删除用户数据本身的逻辑并不复杂,但是会涉及到新的问题。
用户数据是很多网站最重要的财产, 确保用户数据的安全是非常重要的 。
前面学习的用户登录、退出、创建都是相对安全的操作;而删除数据就很危险,弄不好会造成不可逆的损失。因此我们希望对操作者做一些限制,比如只能用户登录且必须是本用户才能进行删除的操作。这就是 权限 。
因此在视图中进行简单的用户权限的验证工作。编写 /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'),
]
复制代码
运行服务器看看效果。登录用户并在右上角下拉框中点击 删除用户 :
点击确定后就可以成功删除用户数据了。
检查数据库
前面我们已经讲过如何用SQLiteStudio查看数据库存储的内容,确保数据真正的从数据库中擦除了。
用 SQLiteStudio 打开项目中 db.sqlite3 文件,找到 auth_user 字段,显示如下:
可以看到 dusai123 这个用户确实已经没有了。
在验证操作数据的逻辑时, SQLiteStudio 可以帮助我们直观的发现问题,一定要善加利用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- MySQL删除操作其实是假删除
- C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——删除
- 我用 Python 找出了删除我微信的所有人并将他们自动化删除了
- C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除
- ruby-on-rails-4 – Rails 4:如何从数据库中删除或删除(连接)表表?
- 删除并恢复
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
iOS应用逆向工程 第2版
沙梓社、吴航 / 机械工业出版社 / 2015-4-1 / 79.00
你是否曾因应用上线的第一天即遭破解而无奈苦恼,想要加以防范,却又束手无策? 你是否曾为某一应用深深折服,想要借鉴学习,却又无从下手? 你是否已不满足于public API,想要进军Cydia开发,却又求学无门? 你是否已产生“不识Apple真面目,只缘身在App Store中”的危机感,想要通过阅读来一窥这冰山一角外的整个北极,却又找不到合适的书? 你是否已经因无法跨越开发......一起来看看 《iOS应用逆向工程 第2版》 这本书的介绍吧!