Как проверить все урлы моего приложения в 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)
Вернуться на верх