通用视图之RedirectView

继承方式

  • 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