Plain is headed towards 1.0! Subscribe for development updates →

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