v0.150.0
 1from plain.http import RedirectResponse
 2from plain.urls import reverse
 3
 4from .base import View
 5
 6
 7class RedirectView(View):
 8    """Provide a redirect on any GET request."""
 9
10    status_code = 302
11    url: str | None = None
12    url_name: str | None = None
13    preserve_query_params = False
14    allow_external = False
15
16    def get_redirect_url(self) -> str:
17        """
18        Return the URL redirect to. Keyword arguments from the URL pattern
19        match generating the redirect request are provided as kwargs to this
20        method.
21        """
22        if self.url:
23            url = self.url % self.url_kwargs
24        elif self.url_name:
25            url = reverse(self.url_name, **self.url_kwargs)
26        else:
27            raise ValueError("RedirectView requires either url or url_name to be set")
28
29        if self.preserve_query_params and self.request.query_string:
30            url = f"{url}?{self.request.query_string}"
31        return url
32
33    def get(self) -> RedirectResponse:
34        url = self.get_redirect_url()
35        return RedirectResponse(
36            url, status_code=self.status_code, allow_external=self.allow_external
37        )
38
39    def head(self) -> RedirectResponse:
40        return self.get()
41
42    def post(self) -> RedirectResponse:
43        return self.get()
44
45    def options(self) -> RedirectResponse:
46        return self.get()
47
48    def delete(self) -> RedirectResponse:
49        return self.get()
50
51    def put(self) -> RedirectResponse:
52        return self.get()
53
54    def patch(self) -> RedirectResponse:
55        return self.get()