Как проверить все урлы моего приложения в Django, чтобы убедиться, что они требуют аутентификации?
Я хочу написать тест Django, который просматривает все URL-адреса в одном конкретном приложении и убеждается, что их нажатие без аутентификации перенаправляет меня на страницу входа.
Что-то вроде:
from django.test import TestCase
from django.urls import reverse
from my_app.urls import urlpatterns
class AuthTest(TestCase):
def _test_url(self, url):
response = self.client.get(url)
self.assertRedirects(response, expected_url=reverse("login_app:login")+ "?next=" + url)
def test_auth(self):
for url in urlpatterns.SOMETHING:
with self.subTest(url=url):
self._test_url(url)
Есть ли способ получить фактический список урлов в каждом urlpattern для моего приложения?
И, связанный с этим вопрос: для тех URL, которые требуют pk, есть ли способ автоматически использовать pk=1
? Мои фиксы будут следить за тем, чтобы pk=1
существовал для всех этих URL.
Поскольку наши приложения по умолчанию требуют аутентификации, мы использовали промежуточное ПО, чтобы убедиться, что пользователь вошел в систему, за исключением некоторых исключенных путей, таких как конечные точки API, которые защищены нашими средствами
Промежуточное программное обеспечение работает следующим образом
from django.http import HttpResponseRedirect, HttpResponse
from django.conf import settings
class UserMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
state = request.user.is_authenticated
path = request.META["PATH_INFO"]
if not state and not path in settings.EXEMPTED_PATHS:
url = settings.LOGIN_URL
if not "next" in path:
if "?" in URL:
url += '&'
else: url += "?"
url += "next=%s" % (
settings.BASE_URL + path).replace("//", "/")
if len(request.GET) > 0:
if "?" in URL:
url += "?"
else: url += "&"
url += "%s" % request.GET.urlencode().replace("//", "/")
return HttpResponseRedirect(url)
return self.get_response(request)