【问题标题】:Letting Users Delete their own accounts in Django让用户在 Django 中删除自己的帐户
【发布时间】:2020-12-18 23:18:05
【问题描述】:

在 Django 2.2 文档中,它声明如下:

“is_active”是一个 布尔值。指定是否应将此用户帐户视为活动帐户。我们建议您将此标志设置为 False 而不是删除帐户;这样,如果您的应用程序对用户有任何外键,则外键不会损坏。

我的问题是,如果我有一个网站,并且我让我的用户能够按照这种做法删除他们自己的帐户, 一旦我的网站获得一点流量,我的数据库不会被非活动帐户填充吗?

让您网站上的用户(没有员工或超级用户身份)在 Django 2.2 中正确删除他们自己的帐户的最佳方法是什么?

提前感谢您的任何帮助

【问题讨论】:

  • 为什么会有问题。数据库使用索引来快速检索数据。所以即使有大量的“死数据”,也不会对性能产生重大影响。
  • 这个想法是,如果您删除一个用户,并且您有一个 Post 和一个 ForeignKeyUser,那么它将删除所有帖子,这可能不是本意。
  • 另外请考虑,如果您提供“删除”选项并且您只是将帐户标记为非活动状态,那么用户会期望他们的数据消失而事实并非如此。由于 GDPR,这对欧洲用户来说是个问题。
  • 可以查看一段时间内的非活跃用户。

标签: django django-2.2


【解决方案1】:

我的问题是,如果我有一个网站,并且我让我的用户能够按照这种做法删除他们自己的帐户,那么一旦我的网站获得一些流量?

最终,是的。问题是,为什么会有这样的问题?。数据库通常在主键上构建索引,这意味着它通常可以有效地检索给定帖子对象的用户,即使存在一定数量的“死数据”。

删除用户的主要问题是经常有触发器会删除所有相关数据。事实上,假设你有一个Post 模型:

from django.conf import settings

class Post(models.Model):
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )

这意味着如果您删除一个用户,它将删除该用户是作者的所有Post 对象,当然不仅是Posts,还有您使用CASCADE 链接到该用户的所有内容扳机。这可能不是预期的效果。通常,您希望保留用户构建的数据,除非用户(明确)要求这样做。

您可以定义视图让人们删除他们的帐户,可以是“软”删除(.is_active 设置为 False),也可以是“硬”删除(删除对象,让触发器波动) .您可以制作如下视图:

# soft delete
from django.contrib.auth import logout as auth_logout, get_user_model
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_http_methods

@login_required
@require_http_method(['POST'])
def remove_account(request):
    user_pk = request.user.pk
    auth_logout(request)
    User = get_user_model()
    User.objects.filter(pk=user_pk).update(is_active=False)
    # …
    # return HTTP response

或硬删除:

# hard delete
from django.contrib.auth import logout as auth_logout, get_user_model
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_http_methods

@login_required
@require_http_method(['POST'])
def remove_account(request):
    user_pk = request.user.pk
    auth_logout(request)
    User = get_user_model()
    User.objects.filter(pk=user_pk).delete()
    # …
    # return HTTP response

并在模板中添加一个删除帐户的按钮:

<form method="post" action="{% url 'name-of-delete-view' %}">
    {% csrf_token %}
    <button type="submit">delete account</button>
</form>

name-of-delete-view 是您在path(…, name=…)re_path(…, name=…) 中为视图指定的名称。

【讨论】:

  • 这是我问题的答案,我真的很感谢你
猜你喜欢
  • 2021-08-27
  • 1970-01-01
  • 2019-02-14
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 2011-01-19
相关资源
最近更新 更多