【问题标题】:Django Middleware keeps redirecting, visiting admin-site not possibleDjango Middleware 不断重定向,无法访问管理站点
【发布时间】:2018-09-20 10:30:18
【问题描述】:

我按照 Django 教程编写了一个中间件类,准确地说,它是一个“需要登录”的中间件,因此只允许用户在登录时在网站上做一些事情。

问题是中间件可以正常工作,但我不能再访问 Django-Admin 网站了。即使在将 admin-url 添加到例外列表之后。他不断将我重定向到“正常登录站点”。

这是我的中间件

import re

from django.conf import settings
from django.shortcuts import redirect
from django.contrib.auth import logout
from django.urls import reverse


EXEMPT_URLS = [re.compile(settings.LOGIN_URL.lstrip('/'))]
if hasattr(settings, 'LOGIN_EXEMPT_URLS'):
    EXEMPT_URLS += [re.compile(url) for url in settings.LOGIN_EXEMPT_URLS]

class LoginRequiredMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        assert hasattr(request, 'user')
        path = request.path_info.lstrip('/')
        print (path)

        # if not request.user.is_authenticated():
        #     if not any(url.match(path) for url in EXEMPT_URLS):
        #         return redirect(settings.LOGIN_URL)

        url_is_exempt = any(url.match(path) for url in EXEMPT_URLS)

        if path == reverse('logout').lstrip('/'):
            logout(request)

        if request.user.is_authenticated() and url_is_exempt:
            return redirect(settings.LOGIN_REDIRECT_URL)

        elif request.user.is_authenticated() or url_is_exempt:
            return None

        else:
                return redirect(settings.LOGIN_URL)

这是 settings.py 中的 Login_EXEMPT_URLS

LOGIN_EXEMPT_URLS = (
r'^admin/',
r'^kalender/login/$',
r'^kalender/logout/$',
r'^kalender/reset-password/$',
r'^kalender/reset-password/done/$',
r'^kalender/reset-password/complete/$',
r'^kalender/reset-password/$',
r'^kalender/reset-password/confirm/',
r'^kalender/returnjson/'
)

LOGIN_URL = '/kalender/login/'
LOGIN_REDIRECT_URL = '/kalender/'
LOGOUT_REDIRECT_URL = '/kalender/'
ADMIN_REDIRECT_URL = '/admin/'

这是我的 urls.py

urlpatterns = [
    url(r'^$', views.home, name='home'),
    url(r'^login/$', login, {'template_name': 'kalender/login.html'}, name='login'),
    #url(r'^logout/$', logout, {'template_name': 'kalender/login.html'}, name='logout'),
    url(r'^logout/$', logout, name='logout'),
    url(r'^delete/$', views.delete, name='delete'),
    url(r'^delete2/$', views.delete2, name='delete2'),
    url(r'^addTimestamp/$', views.addTimestamp, name='addTimestamp'),
    url(r'^delete_many/$', views.delete_many, name='delete_many'),
    url(r'^add_many/$', views.add_many, name='add_many'),
    url(r'^addPT/$', views.addPT, name='addPT'),
    url(r'^deletePT/$', views.deletePT, name='deletePT'),
    url(r'^settings/$', views.edit_settings, name='edit_settings'),
    url(r'^nextMonth/$', views.nextMonth, name='nextMonth'),
    url(r'^previousMonth/$', views.previousMonth, name='previousMonth'),
    url(r'^view_profile/$', views.view_profile, name='view_profile'),
    url(r'^edit_profile/$', views.edit_profile, name='edit_profile'),
    url(r'^change_postbox/$', views.change_postbox, name='change_postbox'),
    url(r'^getNextTimestamp/$', views.getNextTimestamp, name='getNextTimestamp'),
    url(r'^returnjson/$', views.returnjson, name='returnjson'),
    url(r'^change-password$', views.change_password, name='change_password'),
    url(r'^reset-password/$', password_reset, {'template_name': 'kalender/reset_password.html'}, name='reset_password'),
    url(r'^reset-password/done/$', password_reset_done, {'template_name': 'kalender/reset_password_done.html'}, name='password_reset_done'),
    url(r'^reset-password/confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$', password_reset_confirm, {'template_name': 'kalender/reset_password_formular.html'}, name='password_reset_confirm'),
    url(r'^reset-password/complete/$', password_reset_complete, {'template_name': 'kalender/reset_password_complete.html'}, name='password_reset_complete'),
    #url(r'sendEmail/^$', views.sendEmail, name='sendEmail'),
]

编辑:感谢我在这里得到的帮助,我现在可以登录到管理页面,但是一旦我登录,我就会通过 LOGIN_REDIRECT_URL 重定向到我的主页视图。但我想在登录后继续进入管理页面。我怎么做?您可以在这里看到重定向:(Pycharm 中控制台的输出)

admin/
[21/May/2018 13:11:38] "GET /admin/ HTTP/1.1" 302 0
admin/login/
[21/May/2018 13:11:38] "GET /admin/login/?next=/admin/ HTTP/1.1" 200 1668
admin/login/
[21/May/2018 13:11:44] "POST /admin/login/?next=/admin/ HTTP/1.1" 302 0
admin/
[21/May/2018 13:11:44] "GET /admin/ HTTP/1.1" 302 0
kalender/

【问题讨论】:

  • 由于您已经删除了中间件中的前导斜杠,您可以删除 r'^/admin/$'r'^/admin/login/?next=/admin/$',因为它们永远不会匹配。

标签: django django-urls django-middleware


【解决方案1】:

密码重置确认网址类似于kalender/reset-password/confirm/abc-123/。你的正则表达式都不匹配。您需要添加类似r'^kalender/reset-password/confirm/'

【讨论】:

  • 感谢您的建议帮助。现在我只需要为 django 管理站点完成这项工作。如您所见,我已经添加了 URL,但是当我尝试打开管理站点时,他仍然将我重定向到登录页面。
  • r'^admin/$' 只会匹配 admin/(因为美元)。如果您改用r'^admin/',它将匹配admin/ 和其他网址,例如admin/something/else/
  • 该死,我花了几个小时尝试了这么多东西,但由于那个单一的美元符号,它没有奏效。非常感谢。我想将您的回答标记为有用,但我不能,因为我的帐户是新帐户。
  • 很高兴它有帮助。不用担心 - 一旦您获得更多声誉,您就可以对其他问题/答案进行投票。
  • 你好@Alasdair,我想我有点匆忙了。一个多月没做这个项目。还有一个问题。我现在可以访问管理站点,但是在使用管理员凭据登录后,我仍然被重定向到我的主页视图。我编辑了帖子。你能再帮我一次吗?提前致谢
猜你喜欢
  • 2020-05-28
  • 2018-07-14
  • 1970-01-01
  • 2019-01-31
  • 2015-09-18
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多