如何在会话超时时在 Django Admin 中设置自定义管理员登录 URL?

nKn*_*nKn 4 authentication django

我写了一个 Django 应用程序,它有一个外部身份验证系统,可以在某个 URL 上访问(比如,https://.../myproject/login)。这运行良好。

但是,当会话过期时,用户会被重定向到默认登录 url,即https://.../myproject/admin)。我想更改应用程序的行为,因此如果会话过期,则应将用户重定向到https://.../myproject/login并仅/admin在显式打开时使用登录名。

在 Django 中是否有内置的方法来做到这一点?

sun*_*ara 6

当会话过期或会话丢失时,Django admin 将用户重定向到 /admin/login。

有多种方法可以将用户重定向到https://.../myproject/login而不是https://.../myproject/admin/login

方法一:

使用 myproject/login 的视图覆盖 myproject/admin/login URL 的视图。

假设 myproject/login 使用 LoginView 渲染外部系统的登录页面,然后在 myproject/myproject/urls.py 中url(r'^admin/login/?$', LoginView.as_view(), name='admin:login')添加url(r'^admin/', include(admin.site.urls))

urlpatterns = [
   url(r'^admin/login/?$', LoginView.as_view(), name='admin:login'),
   url(r'^admin/', include(admin.site.urls)),
]
Run Code Online (Sandbox Code Playgroud)

优点:

  • 在 /myproject/admin/login 上渲染外部系统的登录页面而不是默认的 Django 管理登录页面

缺点:

  • URL 仍然指向 myproject/admin/login
  • 无法访问默认的管理员登录页面

方法二:

覆盖 myproject/admin/login url 的视图并将用户重定向到 myproject/login

让我们创建一个新视图AdminLoginView,然后在 url(r'^admin/', include(admin.site) 上方添加 url(r'^admin/login/?$', AdminLoginView.as_view(), name='admin:login') .urls)) 在 myproject/myproject/urls.py

from django.core.urlresolvers import reverse

class AdminLoginView(TemplateView):
    def get(self, request, *args, **kwargs):
        """
        Assuming the name of the external system's login url is "login"
        """
        return HttpResponseRedirect(reverse('login'))

Run Code Online (Sandbox Code Playgroud)
urlpatterns = [
   url(r'^admin/login/?$', AdminLoginView.as_view(), name='admin:login'),
   url(r'^admin/default-login/?$', admin.site.login, name='default-admin-login'),
   url(r'^admin/', include(admin.site.urls)),
]
Run Code Online (Sandbox Code Playgroud)

优点:

  • URL 更改为 myproject/login

缺点:

  • 您必须为默认登录页面添加额外的代码。

我建议使用方法2来解决问题中提到的问题。

谢谢。


jac*_*nye 5

您可以使用LOGIN_URLLOGOUT_REDIRECT_URL

https://docs.djangoproject.com/en/2.2/ref/settings/#login-url

重定向到myproject/login登录(默认重定向到 /accounts/login/)

LOGIN_URL = '/myproject/login/'
Run Code Online (Sandbox Code Playgroud)

注销后重定向到登录页面(默认为无)。

LOGOUT_REDIRECT_URL = '/myproject/login/'
Run Code Online (Sandbox Code Playgroud)