【问题标题】:External django redirect with POST parameters带有 POST 参数的外部 django 重定向
【发布时间】: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 清除它。看起来我在尝试使用重定向来解决这个问题时走错了路。

【问题讨论】:

    标签: jquery django redirect external post-parameter


    【解决方案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 参数进行重定向。我的想法是:

    1. 使用所需参数重定向到 GET 目标。
    2. 在 GET 页面上,使用您转发的参数设置表单
    3. 自动提交表单。

    这是大多数文件下载服务所做的,有时甚至是支付页面(Paypal 等)。它确实有点难看(多跳一跳),但有它自己的好处。

    【讨论】:

    • 自动提交表单。你能详细说明那一步吗?谢谢。
    • 当然。 ``` $(document).ready(function(){ $("#your_form").submit(); }) ```
    猜你喜欢
    • 2017-11-08
    • 2011-02-21
    • 1970-01-01
    • 2019-05-02
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多