如何在Django中重定向到外部URL?

33

我认为这应该很容易,但我却想不出来。我正在尝试编写一个退出视图。我收到了get请求。通过urls.py,我呈现了我的退出视图。在这个视图中,我将一些参数保存到数据库中,然后想将用户重定向到外部URL。我尝试过:

return redirect('http://stackoverflow.com/')

来自Django文档。但是,Optout视图呈现培训模板而不是返回重定向,尽管参数按预期保存在数据库中。我的代码如下:

def optout(request):
    if (('REMOTE_USER' in request.META and request.META['REMOTE_USER'] != "") or 
        (request.session.get('userid', False) and request.session['userid'] != "")):
        if ('REMOTE_USER' in request.META and request.META['REMOTE_USER'] != ""):
            userid = request.META['REMOTE_USER']
        if (request.session.get('userid', False) and request.session['userid'] != ""):
            userid = request.session['userid']
        user = User.objects.get(username=userid)
        user.optout = True
        user.postpone = False
        user.save()
        return redirect('http://stackoverflow.com/')
    context = { 'userid': "" }
    return render(request, 'games/Training.html', context)

非常感谢任何形式的帮助。


1
“它不起作用”是什么意思?Optout视图呈现了Training模板,而不是返回重定向? - John Gordon
@JohnGordon,是的。你说得对。Optout视图呈现了Training模板,而不是返回重定向,尽管参数按预期保存在数据库中。 - 1man
类似的问题已经在这里得到了解答:https://dev59.com/j2jWa4cB1Zd3GeqPoTSC - AramirezMiori
4
如果正在呈现“训练模板”,那么很可能您的顶部if语句评估为false(因此重定向从未被调用)。数据库保存必须发生在其他地方。尝试添加一些日志记录语句。 - John Gordon
你导入了redirect吗?从django.shortcuts中导入redirect。 - moojen
2个回答

36

是的,return redirect('http://stackoverflow.com/') 是正确的方法。

如果您执行以下操作,您可以确认这是一个可用的重定向方法。

   from django.shortcuts import redirect

   def optout(request):
       return redirect("http://stackoverflow.com/")

你的条件语句不能有漏网之鱼。


是的,Gator_Python。谢谢您的回复。我已经多次检查了数据库,两个参数都被正确保存。 - 1man
那么,预期的重定向没有发生,发生了什么? - sytech
optout视图呈现Training模板,而不是返回重定向,尽管参数按预期保存在数据库中。 - 1man
1
不要检查你的数据库,尝试打印出你正在检查的条件,看看它们是否与你期望的匹配。或者为了证明“return redirect”部分有效,将该条件更改为“if True”。然后我们可以缩小范围,找出为什么这些条件没有被捕获,这正是我怀疑正在发生的事情。 - sytech
有没有办法像在HTML中使用“_blank”一样,在新标签页中打开链接? - Anurag-Sharma

18

使用类 HttpResponseRedirect

from django.http import HttpResponseRedirect

def out(request):
    return HttpResponseRedirect("http://google.com")

或者:

使用类 HttpResponse

from django.http import HttpResponse

def out(request):
    response = HttpResponse("", status=302)
    response['Location'] = "scheme://host"
    return response

注意:

最后一个用于将网站重定向到移动(Android/iPhone)应用程序,其中位置为 scheme://host


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接