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

Posted

技术标签:

【中文标题】如何在 Django 中重定向到外部 URL?【英文标题】:How to redirect to external URL in Django? 【发布时间】:2016-06-24 13:12:31 【问题描述】:

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

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

来自Django documentation。但是,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://***.com/')
    context =  'userid': "" 
    return render(request, 'games/Training.html', context)

非常感谢任何帮助。

【问题讨论】:

你说的不起作用是什么意思? optout 视图呈现的是 Training 模板而不是返回重定向? @JohnGordon,是的。你说得对。尽管参数按预期保存在数据库中,但 optout 视图会呈现训练模板而不是返回重定向。 类似问题已回答here 如果它正在渲染训练模板,那么很可能您的顶部 if 语句评估为 false(因此永远不会调用重定向)。数据库保存必须在其他地方进行。尝试放入一些日志语句。 你导入重定向了吗?从 django.shortcuts 导入重定向 【参考方案1】:

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

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

   from django.shortcuts import redirect

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

你的条件语句不能被抓住。

【讨论】:

是的 Gator_Python。谢谢您的答复。我多次检查数据库,两个参数都保存正确。 那么,发生了什么而不是预期的重定向? optout 视图呈现训练模板而不是返回重定向,尽管参数按预期保存在数据库中。 不要检查您的数据库,而是尝试打印出您要检查的条件,看看它们是否符合您的预期。或者将条件更改为 if True 只是为了证明 return redirect 部分有效。然后我们可以缩小我们的范围,找出为什么这些没有捕捉到,这就是我怀疑正在发生的事情。 有没有一种方法可以在新标签页上打开链接,就像我们在 HTML 中使用 _blank 一样?【参考方案2】:

使用类 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

注意:

最后一个对于从网站重定向到移动设备很有用 (安卓/苹果手机)应用程序。位置在哪里scheme://host

【讨论】:

以上是关于如何在 Django 中重定向到外部 URL?的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中重定向到外部URL

在laravel中重定向到外部url时如何保留会话数据

如何在 Django 中重定向(包括 URL 更改)?

如何在带有上下文的 Django 中重定向?

如何在 JSF 2.0 中重定向

如何在 ASP.NET MVC 中重定向到动态登录 URL