我正在使用Djang nonrel和App Engine并且遇到重定向问题。
在我的视图处理程序中进行非常简单的重定向:
@login_required
def dashboard(request):
if check_if_user_needs_to_import(request.user):
return redirect("user_welcome")
不是在App Engine中正确重定向,而是在浏览器中返回此消息:
状态:302 FOUND Vary:Cookie Content-Type:text / html; charset = utf-8位置:http://site.appspot.com/user/welcome/
如果我手动在浏览器中再次输入URL,则加载就好了。这似乎只是在使用redirect()函数时出现问题,使用render_to_response()的任何视图都可以正常工作。
其他信息: 我已经尝试过两个重定向('name_of_view') - 它会调用反向URL查找以及重定向('/ path / to / url /'),它应该由redirect()函数解析,该函数是原生的django的。
两种情况都不起作用
答案 0 :(得分:3)
在Django发送自己的响应之前,您似乎正在向响应输出文本。检查代码中的print
语句 - 更有可能是你在调用print,这是你永远不应该在WSGI应用程序中做的。 print的输出在Django应用程序的任何输出之前发送,因此被视为响应的开始。因此,Django发送的标题会输出到正文。
答案 1 :(得分:0)
好的,有些事可能会有所帮助:
这是在多个浏览器中发生的吗? HTTP状态302是重定向的正确状态,也许您已启用一些调试模式/插件,这会改变浏览器的处理方式?
您是否有使用相对网址路径的原因?为什么不使用类似的东西:
return redirect('/user_welcome')
答案 2 :(得分:0)
我遇到了类似的问题,最终找到了根本原因。
在您使用的任何重定向功能中,您需要确保打印输出的格式为
“状态:302找到\ n位置:http://www.someurl.com \ n \ n”
如果最后没有两个换行符“\ n \ n”,您的重定向将在生产中无法正常工作(尽管它可以在开发服务器上运行)。
关于Nick的评论:你应该依赖你的框架,而不是使用sys.stdout.write或print来输出你自己的东西。然而,有些人喜欢明确(低级)了解正在发生的事情,并且有时需要建立自己的小CGI以满足特定需求。但正如尼克所说,同时混合打印和框架显然会导致重大问题: - )