在 django web 应用程序上注销会重定向到 django 管理员注销页面。这是怎么回事?

Posted

技术标签:

【中文标题】在 django web 应用程序上注销会重定向到 django 管理员注销页面。这是怎么回事?【英文标题】:Logging out on django web app redirects to django admin logout page. What's going on? 【发布时间】:2021-10-30 15:11:27 【问题描述】:

我正在学习 Python Crash Course 书中关于使用 Django 创建简单网页的教程。我刚刚创建了一个应用程序,使用 Django 的默认用户身份验证系统在我的页面上登录和注销用户。当我注销时,Django 不会重定向到我创建的模板以显示用户已注销。相反,它会重定向到 Django 管理员注销页面。

这是我的基本 urls.py 文件。

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('users/', include('users.urls')),
    path('', include('learning_logs.urls')),

]

这是我的“用户”应用程序 urls.py 文件。

from django.urls import path, include

app_name = 'users'
urlpatterns = [
    # Include default auth URLs
    path('', include('django.contrib.auth.urls')),
]

这是我的 base.html 模板。

<p>
<a href="% url 'learning_logs:index' %">Learning Log</a> -
  <a href="% url 'learning_logs:topics' %">Topics</a>
  % if user.is_authenticated %
    Hello,  user.username .
    <a href="% url 'users:logout' %">Log out</a>
  % else %
    <a href="% url 'users:login' %">Log in</a>
  % endif %
</p>

这是我的 logout.html 模板。

% extends "learning_logs/base.html" %

% block content %
  <p>You have been logged out. Thanks for stopping by!</p>
% endblock content %

这是我在 settings.py 中安装的应用程序

INSTALLED_APPS = [
    # My Apps
    'learning_logs',
    'users',

    # Default Apps
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

当页面重定向到 Django Admin 注销时,url 显示为 http://localhost:8000/users/logout/ 这是我想要的 url。另外,我正在使用我的管理员用户名和密码登录网页。

感谢任何帮助!

编辑:使用的 Django 版本是 3.2.6。教程中使用的版本是 2.2

【问题讨论】:

【参考方案1】:

在 settings.py 你可以设置logout redirect url 试试这个

LOGOUT_REDIRECT_URL = '/path_to_the_page'
LOGIN_URL = '/path_to_the_page'

【讨论】:

谢谢,这似乎是正确的方向。我应该如何写网址?我尝试了 /users/logout ,这是我试图访问的网页,但该页面没有正确重定向。如何让 Django 看到我正在尝试使用的 logout.html 模板? 所以你有一个带有模板 logout.html 的自定义视图,对吗?那么您必须在 logout_redirect_url 中添加该自定义注销视图的 URL,我想您明白了.. 我得到了第一部分,但我的网址有问题。 LOGOUT_REDIRECT_URL = 'users:logout' 重定向到 localhost:8000/users/logout 这是正确的 url,但会引发浏览器错误页面未正确重定向。如果我重定向到指向同一目录中的模板的 url LOGOUT_REDIRECT_URL = 'users:login' ,它就可以正常工作。它实际上只是“用户:注销”,它不起作用。我错过了什么? 好吧,分享注销视图它的 URL,以及你得到的完整错误。 这个应用实际上没有任何视图。我不知道为什么因为我很新,也许是因为它使用了默认的 django 身份验证系统,它有自己的默认视图?无论如何,其他 url 'users:login' 也没有视图,并且工作正常。我得到的浏览器错误是:页面未正确重定向 Firefox 检测到服务器正在以永远不会完成的方式重定向对该地址的请求。控制台中的服务器仅显示 [31/​​Aug/2021 23:40:44] "GET /users/logout/ HTTP/1.1" 302 0 等重复。【参考方案2】:

在您的设置中,假设您有基于功能的视图,您可以轻松地做到这一点

def hello(request):
    return render (request, 'logout_redirect.html')
and in url
  path('hello/', views.hello, name="hello")

所以在你的设置中这样做

LOGIN_URL = 'accounts:login'
LOGIN_REDIRECT_URL = 'accounts:home'
LOGOUT_REDIRECT_URL = 'accounts:home'

第二种方式只是传递你的观点

@login_required
def user_logout(request):
    logout(request)
    return redirect('accounts:login') 

这两种类型都必须在您的页面中,首先是如果用户从管理面板注销告诉去哪里,然后是自定义用户告诉他必须重定向到哪里,这样您就可以更改您的注销重定向 url两种不同类型的用户,或者如果您想为两个用户重定向相同的 url,则通过相同的路径

我建议您阅读 django 的完整文档以更好地理解 https://docs.djangoproject.com/en/3.2/topics/auth/default/

【讨论】:

【参考方案3】:

解决了!事实证明,注销模板必须命名为logged_out.html才能在这种情况下工作。当我从 logout.html 重命名它时,页面正确重定向到自定义注销模板。

【讨论】:

以上是关于在 django web 应用程序上注销会重定向到 django 管理员注销页面。这是怎么回事?的主要内容,如果未能解决你的问题,请参考以下文章

即使在登录后 Django 也会重定向到登录页面

如何配置在Django中注销后重定向到哪里?

如何配置在Django中注销后重定向到哪里?

Django 自动注销和页面重定向

终极会员注销无法使用 WPML

当我有“下一个”网址时,如何禁用网址重定向? - 姜戈