我想写一个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)
是否有一种方法来获得每个url模式的url的实际列表为我的应用程序?
并且,相关的问题是:对于那些需要pk的url,是否有一种方法可以自动使用pk=1
?我的fixture将确保所有这些url都存在pk=1
。
由于我们的应用程序默认需要身份验证,我们使用中间件来确保用户登录,除非某些豁免路径(如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)