Plain is headed towards 1.0! Subscribe for development updates →

plain-redirection

 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