Я следовал учебнику 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/
r'^/admin/$'
иr'^/admin/login/?next=/admin/$'
, так как они никогда не совпадут. - person Alasdair   schedule 12.04.2018