Plain is headed towards 1.0! Subscribe for development updates →

 1import logging
 2
 3from plain.http import (
 4    ResponseGone,
 5    ResponsePermanentRedirect,
 6    ResponseRedirect,
 7)
 8from plain.urls import reverse
 9
10from .base import View
11
12logger = logging.getLogger("plain.request")
13
14
15class RedirectView(View):
16    """Provide a redirect on any GET request."""
17
18    permanent = False
19    url: str | None = None
20    pattern_name: str | None = None
21    query_string = False
22
23    def __init__(self, url=None, permanent=None):
24        # Allow url and permanent to be set in RedirectView.as_view(url="...", permanent=True)
25        self.url = url or self.url
26        self.permanent = permanent if permanent is not None else self.permanent
27
28    def get_redirect_url(self):
29        """
30        Return the URL redirect to. Keyword arguments from the URL pattern
31        match generating the redirect request are provided as kwargs to this
32        method.
33        """
34        if self.url:
35            url = self.url % self.url_kwargs
36        elif self.pattern_name:
37            url = reverse(self.pattern_name, *self.url_args, **self.url_kwargs)
38        else:
39            return None
40
41        args = self.request.meta.get("QUERY_STRING", "")
42        if args and self.query_string:
43            url = f"{url}?{args}"
44        return url
45
46    def get(self):
47        url = self.get_redirect_url()
48        if url:
49            if self.permanent:
50                return ResponsePermanentRedirect(url)
51            else:
52                return ResponseRedirect(url)
53        else:
54            logger.warning(
55                "Gone: %s",
56                self.request.path,
57                extra={"status_code": 410, "request": self.request},
58            )
59            return ResponseGone()
60
61    def head(self):
62        return self.get()
63
64    def post(self):
65        return self.get()
66
67    def options(self):
68        return self.get()
69
70    def delete(self):
71        return self.get()
72
73    def put(self):
74        return self.get()
75
76    def patch(self):
77        return self.get()