【问题标题】:Django user account delete and then return redirect and renderDjango 用户帐户删除然后返回重定向和渲染
【发布时间】:2023-04-02 10:33:01
【问题描述】:

我想允许用户删除他的帐户,删除后,我希望用户退出并查看 html 页面account_deleted.html 进行确认。

学生/views.py:

def delete_account(request):
    user = User.objects.get(username=request.user)
    user.delete()

    context = {
        "deleted_msg": "Account has been deleted",
    }
    return render(request, "students/account_deleted.html", context) and redirect("students:logout")

对于注销,我使用的是内置的 LogoutView 功能。我的 settings.py 中的注销重定向 URL 设置为我的主页。

学生/urls.py:

path('logout/', LogoutView.as_view(), name='logout'),

如果账户被删除,如何让delete_account(request) 函数同时返回渲染和重定向?这甚至可能吗? 谢谢!

【问题讨论】:

  • 为什么要在删除用户后注销用户没有意义
  • 我认为简单的解决方案是将按钮添加到account_deleted.html 以手动重定向到登录而不是注销页面,或者通过js 进行。
  • @c.grey 因为即使在删除帐户后,用户似乎也已登录。当我尝试访问用户个人资料时,网站显然崩溃了。
  • redirect 只是带​​有301302 代码的响应。您可以在响应中包含正文,但对于正确的重定向响应,它不会被呈现,浏览器将重定向到新位置。
  • 为了防止网站崩溃,您需要在需要用户的地方添加登录所需的装饰器

标签: django django-users


【解决方案1】:

您可以在删除帐户之前注销用户,方法是在您的user.delete() 行之前放置logout(request)。您需要使用from django.contrib.auth import logout 导入它。

正如布鲁诺在他的回答中所说,在 POST 请求之后使用重定向而不是 render 更好,您应该更新视图以仅响应 POST 请求。

如果您在删除用户后遇到网站崩溃问题,请确保您在所有视图中都使用了正确的访问控制,例如,在所有需要要登录的用户。如果您这样做,用户将被重定向到登录页面,如果他或她没有登录,而不是让您的网站崩溃。

【讨论】:

  • @Shafin M 感谢您接受我的回答,但也请看看布鲁诺的回答。
【解决方案2】:

首先要做的是:您的视图应该 1/ 只接受登录用户和 2/ 只接受 POST 请求(您绝对不希望 GET 请求从您的数据库中删除任何内容)。另外,这个:

User.objects.filter(username=request.user)

没用 - 您已经request.user 中有当前用户 - 如果您的身份验证后端允许重复的用户名,则可能存在危险。

还有这个:

return render(request, "students/account_deleted.html", context) and redirect("students:logout")

当然是完全错误的。一个视图返回一个 HTTP 响应,你不能返回两个(这没有任何意义),你不能将两个响应“和”在一起(嗯,你可以,但结果肯定不是你所期望的 -阅读有关 and 运算符的 FineManual)。

正确的解决方案是 1/ 手动注销用户(参见 voodoo-burger 的回答),2/ use the messages framework 通知用户她的帐户已被删除,以及 3/ 重定向到主页(您总是想要在成功发布后重定向,请参阅 https://en.wikipedia.org/wiki/Post/Redirect/Get 了解原因)。

【讨论】:

    猜你喜欢
    • 2017-10-27
    • 1970-01-01
    • 2019-12-04
    • 2021-12-25
    • 2021-01-11
    • 2021-08-18
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多