带有 POST 参数的外部 django 重定向
Posted
技术标签:
【中文标题】带有 POST 参数的外部 django 重定向【英文标题】:External django redirect with POST parameters 【发布时间】:2010-11-23 16:07:37 【问题描述】:我正在尝试在 Django 视图中创建一个重定向到外部 url,并在请求中附加了一些获取参数。环顾四周,四处尝试后,我似乎遇到了障碍。
所以我的视图看起来像这样
def view(request):
data = get.data(request)
if something in data:
return HttpResponseRedirect('example.com')
这是我所能得到的。我知道您在请求 url 中可以指定一些 get 参数,如下所示:
...
return HttpResponseRedirect('example.com?name=smith&color=brown')
但是,由于某些数据是敏感的,我不希望它最终出现在 url 中。由于它是一个外部 url,我不能使用接受视图参数的 redirect() 快捷方式。所以请告诉我,如何完成这样的任务?
编辑
在环顾四周并在 IRC 中聊了几句之后,看来我应该做的是让包含付款信息的 get 参数远离用户,而是将它们作为帖子发送。有人告诉我,你应该也可以使用一些 JS 来做到这一点,可能是 jQuery。这个问题仍然存在,尽管现在有点复杂。如何借助 javascript 在 django 中创建帖子重定向?
第二次编辑
好像我被误导了。感谢您使用重定向协议 DR 清除它。看起来我在尝试使用重定向来解决这个问题时走错了路。
【问题讨论】:
【参考方案1】:我建议采用以下方法。在您的 Django 视图/模板中,向浏览器返回表单,其中包含您想要作为隐藏表单元素发布的所有参数。一旦表单加载,JavaScript 就会将表单提交 (POST) 到您想要的任何地方。
查看:
from django.shortcuts import render_to_response
def view(request):
return render_to_response('test.html', 'foo': 123, 'bar': 456 )
模板:
<html>
<head>
<title>test</title>
<script type="text/javascript">
function load()
window.document.test.submit();
return;
</script>
</head>
<body onload="load()">
<form name="test" method="post" action="http://www.example.com">
<input type="hidden" name="foo" value= foo />
<input type="hidden" name="bar" value= bar />
</form>
</body>
</html>
【讨论】:
这是一种避免重定向的聪明方法。但是,这取决于 javascript,因此也需要进行优雅的降级。我想知道这在实践中会有多顺利,必须先加载页面才能进行 js 发布。 是的,此解决方案取决于浏览器中启用的 JavaScript,但这并不意味着您需要在此页面上正确执行此操作。您甚至应该在查看您的视图之前检查 JavaScript。因此,如果未启用它,那么用户甚至不会走这么远。至于页面的加载,这将取决于您的视图返回的速度,以及结果 HTML 的大小。如果您只有几个字段,我猜页面的呈现将在亚秒时间内完成。重定向本身也很快,因此该解决方案的用户体验与普通重定向非常相似。 但是这种解决方案的安全隐患是什么?我想将参数发布到支付网关。将我的 auth_id 等敏感数据发送给用户安全吗?就没有别的办法了吗? @SudhanshuShekhar 这不是您的解决方案,在您的情况下,您应该从 django 视图从后端发布到您的支付网关。无需将所有这些参数返回给浏览器。 @umnik700 :我们不能使用 POST 参数重定向到另一个 url,对吧?我该怎么做呢?我的用户填写了一些信息,然后需要将这些信息与一些私有属性一起发送到支付网关。最好的方法是什么?【参考方案2】:GET 参数总是在 URL 中,这就是使它们成为 GET 参数的原因。
无法使用 POST 参数(不在 URL 中)重定向 - 这是 HTTP 的限制,而不是 Django。
【讨论】:
这是否意味着无法重定向到支付站点/窗口,而用户无法看到正在发送的所有数据?【参考方案3】:我不同意 Daniel,有一种方法可以绕过 HTTP 限制,即仅使用 get 参数进行重定向。我的想法是:
-
使用所需参数重定向到 GET 目标。
在 GET 页面上,使用您转发的参数设置表单
自动提交表单。
这是大多数文件下载服务所做的,有时甚至是支付页面(Paypal 等)。它确实有点难看(多跳一跳),但有它自己的好处。
【讨论】:
自动提交表单。你能详细说明那一步吗?谢谢。 当然。 ``` $(document).ready(function() $("#your_form").submit(); ) ```以上是关于带有 POST 参数的外部 django 重定向的主要内容,如果未能解决你的问题,请参考以下文章