Django Middleware продолжает перенаправлять, посещение сайта администратора невозможно

Я следовал учебнику 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)

Это Login_EXEMPT_URLS в settings.py.

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/

person stofuser91    schedule 10.04.2018    source источник
comment
Поскольку вы уже удаляете косую черту в своем промежуточном программном обеспечении, вы можете удалить r'^/admin/$' и r'^/admin/login/?next=/admin/$', так как они никогда не совпадут.   -  person Alasdair    schedule 12.04.2018


Ответы (1)


URL-адрес подтверждения сброса пароля выглядит примерно так: kalender/reset-password/confirm/abc-123/. Ни одно из ваших регулярных выражений не соответствует этому. Вам нужно добавить что-то вроде r'^kalender/reset-password/confirm/'

person Alasdair    schedule 10.04.2018
comment
Спасибо ваш совет помог. Теперь мне просто нужно сделать это для административного сайта django. Как видите, я уже добавил URL-адреса, но он по-прежнему перенаправляет меня на страницу входа, когда я пытаюсь открыть сайт администратора. - person stofuser91; 12.04.2018
comment
r'^admin/$' будет соответствовать только admin/ (из-за доллара). Если вместо этого вы используете r'^admin/', он будет соответствовать admin/ и другим URL-адресам, таким как admin/something/else/. - person Alasdair; 12.04.2018
comment
Черт, я часами перепробовал столько всего, и это не сработало из-за этого единственного символа доллара. Большое Вам спасибо. Я хотел бы отметить ваш ответ как полезный, но я не могу, так как моя учетная запись новая. - person stofuser91; 12.04.2018
comment
Рад, что это помогло. Не беспокойтесь об этом — вы сможете голосовать за другие вопросы/ответы, когда у вас будет немного больше репутации. - person Alasdair; 12.04.2018
comment
Привет @Alasdair, кажется, я немного поторопился. Не работал над проектом больше месяца. Осталась еще одна проблема. Теперь я могу посетить сайт администратора, но после входа в систему с учетными данными администратора меня все еще перенаправляют на домашний экран. Я отредактировал сообщение. Не могли бы вы помочь мне снова? заранее спасибо - person stofuser91; 21.05.2018
comment
Это звучит как другая проблема, поэтому вам лучше задать новый вопрос — этот вопрос помечен как принятый, поэтому он не привлечет внимания. Кратко взглянув на ваш вопрос, я не понимаю, почему вы делаете if request.user.is_authenticated() and url_is_exempt:. Кроме того, когда вы делаете redirect(settings.LOGIN_URL), вы не включаете никакой информации о том, откуда вы перенаправляетесь (например, ?next=/current-url/, поэтому пользователь не будет перенаправлен обратно на исходную страницу после входа в систему. - person Alasdair; 21.05.2018