继承方式
- RedirectView(View)
- View
graph TD RedirectView -->|依赖其初始化函数及访问方法调用| View(View)
处理过程
url会将request对象和其他用户定义参数传入RedirectView,View父类负责执行初始化方法,将用户定义变量添加到类属性中,并调用as_view方法查找对应请求方式的处理函数(RedirectView中的get,post等方法)。对应的处理函数根据类中的参数返回永久重定向或临时重定向
代码解析
RedirectView
继承
继承自View
主要参数
- permanent
是否永久重定向bool值。True为永久重定向,Fales反之。默认为False - url
重定向到的链接 - pattern_name
指定重定向到的view视图。url和此必须指定一个,如和url同时指定,则使用url - query_string
是否使用url参数bool值。True为使用url参数。默认为False。如此请求对应多种http访问方法,不要开启此参数。
功能函数
- get_redirect_url 返回重定向到的url。当使用view视图时,会使用reverse函数解析成url地址。当query_string为真时,会将请求中携带的参数拼接到url中
- get 根据permanent参数判断是否返回永久重定向。如url地址获取失败会触发410异常
- head post options delete put patch 均调用get方法。
代码
class RedirectView(View):
"""Provide a redirect on any GET request."""
permanent = False
url = None
pattern_name = None
query_string = False
def get_redirect_url(self, *args, **kwargs):
"""
Return the URL redirect to. Keyword arguments from the URL pattern
match generating the redirect request are provided as kwargs to this
method.
"""
if self.url:
url = self.url % kwargs
elif self.pattern_name:
url = reverse(self.pattern_name, args=args, kwargs=kwargs)
else:
return None
args = self.request.META.get('QUERY_STRING', '')
if args and self.query_string:
url = "%s?%s" % (url, args)
return url
def get(self, request, *args, **kwargs):
url = self.get_redirect_url(*args, **kwargs)
if url:
if self.permanent:
return HttpResponsePermanentRedirect(url)
else:
return HttpResponseRedirect(url)
else:
logger.warning(
'Gone: %s', request.path,
extra={'status_code': 410, 'request': request}
)
return HttpResponseGone()
def head(self, request, *args, **kwargs):
return self.get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.get(request, *args, **kwargs)
def options(self, request, *args, **kwargs):
return self.get(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.get(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.get(request, *args, **kwargs)
def patch(self, request, *args, **kwargs):
return self.get(request, *args, **kwargs)
View
参考ListView