我正在尝试根据请求标头中的引用来重定向用户。基本上,如果引用者说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,但无济于事
答案 0 :(得分:2)
alecxe是正确的..您必须从预期返回HttpResponse
的方法重定向。
get_context_data
预计不会返回HttpResponse
,并且view
不会返回get
。它总是用于获取数据字典以填充说模板。无论你从这个方法返回什么,它都不会覆盖响应。
因此,无论您何时编写此覆盖,都需要位于预期会返回响应的位置,例如post
,dispatch
,get_context_data
。
现在的问题是确定如何将对象置于{{1}}方法之外。
答案 1 :(得分:0)
对于调试,我建议您首先使用普通重定向('some_view'),无条件地执行调度方法,这样您就可以检查是否按预期命中重定向,然后再查看条件和其他任何内容。 @ Yuji-tomita-tomita恰到好处! :) Django-pdb和ipdb是非常好的工具。