从基于django类的视图重定向到外部页面

时间:2015-02-27 19:55:27

标签: python django

我正在尝试根据请求标头中的引用来重定向用户。基本上,如果引用者说https://www.google.com,我想将它们发送到一个页面,而不是我的网站。否则,照常继续处理。

这是我到目前为止所拥有的

class ArticleAccess(TemplateView, SomeMixin):
    http_method_names = ['get']
    template_name = 'template.html'

    def dispatch(self, request, *args, **kwargs):
        return super(ArticleAccess, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):

        context = super(ArticleAccess, self).get_context_data(**kwargs)
        item = get_object_or_404(ClientItem.objects.using(self.get_site().name), id=kwargs['article_id'])

        if self.request.META.get('HTTP_REFERER') == 'https://www.google.com/':
            return redirect(item.item_url)

        context['id'] = item.id
        context['name'] = item.name
        context['html'] = item.description
        context['item_url'] = item.item_url

        return context

这只是停留在同一页面而不是重定向。我也试过HttpResponseRedirect,但无济于事

2 个答案:

答案 0 :(得分:2)

alecxe是正确的..您必须从预期返回HttpResponse的方法重定向。

get_context_data预计不会返回HttpResponse,并且view不会返回get。它总是用于获取数据字典以填充说模板。无论你从这个方法返回什么,它都不会覆盖响应。

因此,无论您何时编写此覆盖,都需要位于预期会返回响应的位置,例如postdispatchget_context_data

现在的问题是确定如何将对象置于{{1}}方法之外。

答案 1 :(得分:0)

对于调试,我建议您首先使用普通重定向('some_view'),无条件地执行调度方法,这样您就可以检查是否按预期命中重定向,然后再查看条件和其他任何内容。 @ Yuji-tomita-tomita恰到好处! :) Django-pdb和ipdb是非常好的工具。