1from plain.http import ResponseRedirect
2
3
4class RedirectionMiddleware:
5 def __init__(self, get_response):
6 self.get_response = get_response
7
8 def __call__(self, request):
9 response = self.get_response(request)
10
11 if response.status_code == 404:
12 from .models import NotFoundLog, Redirect, RedirectLog
13
14 redirects = Redirect.objects.filter(enabled=True).only(
15 "id", "from_pattern", "to_pattern", "http_status", "is_regex"
16 )
17 for redirect in redirects:
18 if redirect.matches_request(request):
19 # Log it
20 redirect_log = RedirectLog.from_redirect(redirect, request)
21 # Then redirect
22 return ResponseRedirect(
23 redirect_log.to_url, status=redirect.http_status
24 )
25
26 # Nothing matched, just log the 404
27 NotFoundLog.from_request(request)
28
29 return response