1- import logging
2-
31from plain .http import (
4- ResponseGone ,
52 ResponsePermanentRedirect ,
63 ResponseRedirect ,
74)
85from plain .urls import reverse
96
107from .base import View
118
12- logger = logging .getLogger ("plain.request" )
13-
149
1510class RedirectView (View ):
1611 """Provide a redirect on any GET request."""
1712
1813 permanent = False
1914 url : str | None = None
20- pattern_name : str | None = None
21- query_string = False
15+ url_name : str | None = None
16+ preserve_query_params = False
2217
23- def __init__ (self , url = None , permanent = None ):
24- # Allow url and permanent to be set in RedirectView.as_view(url="...", permanent=True)
18+ def __init__ (
19+ self , url = None , permanent = None , url_name = None , preserve_query_params = None
20+ ):
21+ # Allow attributes to be set in RedirectView.as_view(url="...", permanent=True, etc.)
2522 self .url = url or self .url
2623 self .permanent = permanent if permanent is not None else self .permanent
24+ self .url_name = url_name or self .url_name
25+ self .preserve_query_params = (
26+ preserve_query_params
27+ if preserve_query_params is not None
28+ else self .preserve_query_params
29+ )
2730
2831 def get_redirect_url (self ):
2932 """
@@ -33,30 +36,22 @@ def get_redirect_url(self):
3336 """
3437 if self .url :
3538 url = self .url % self .url_kwargs
36- elif self .pattern_name :
37- url = reverse (self .pattern_name , * self .url_args , ** self .url_kwargs )
39+ elif self .url_name :
40+ url = reverse (self .url_name , * self .url_args , ** self .url_kwargs )
3841 else :
39- return None
42+ raise ValueError ( "RedirectView requires either url or url_name to be set" )
4043
4144 args = self .request .meta .get ("QUERY_STRING" , "" )
42- if args and self .query_string :
45+ if args and self .preserve_query_params :
4346 url = f"{ url } ?{ args } "
4447 return url
4548
4649 def get (self ):
4750 url = self .get_redirect_url ()
48- if url :
49- if self .permanent :
50- return ResponsePermanentRedirect (url )
51- else :
52- return ResponseRedirect (url )
51+ if self .permanent :
52+ return ResponsePermanentRedirect (url )
5353 else :
54- logger .warning (
55- "Gone: %s" ,
56- self .request .path ,
57- extra = {"status_code" : 410 , "request" : self .request },
58- )
59- return ResponseGone ()
54+ return ResponseRedirect (url )
6055
6156 def head (self ):
6257 return self .get ()
0 commit comments