在 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 管理员注销页面。这是怎么回事?的主要内容,如果未能解决你的问题,请参考以下文章