【问题标题】:How to redirect to an external url with parameters and POST method?如何使用参数和 POST 方法重定向到外部 url?
【发布时间】:2014-11-13 09:24:48
【问题描述】:

我想在提交到烧瓶中的操作 url 之前保存表单数据

<form action="" method="POST">
    <input type="hidden" name="PAYEE_ACCOUNT" value="U1234567">
    <input type="hidden" name="PAYEE_NAME" value="Name">
    <input type="text"   name="PAYMENT_AMOUNT">
    <input type="submit" name="PAYMENT_METHOD" />
</form>

我可以提交此表单,但我想在提交前保存表单数据

查看:

@mod.route('/payment/', methods=['GET', 'POST'])
def payment():
    if request.method != "POST":
        return render_template('form.html')

    form = request.form

    form_data = {'PAYEE_ACCOUNT': form['PAYEE_ACCOUNT'],
                 'PAYEE_NAME': form['PAYEE_Name'],
                 'PAYMENT_AMOUNT' : form['PAYMENT_AMOUNT']
                 }

    # Save Data

    import urllib
    params = urllib.urlencode(form_data)

    url = 'http://www.example.com'
    return redirect(url, params)

请帮帮我

【问题讨论】:

  • 您要将数据保存在哪里?在用户的计算机上?
  • 不,我将数据保存在服务器中,我只想重定向到带有参数的 url

标签: python redirect flask post-parameter


【解决方案1】:

发送 307 状态代码而不是 302 应该告诉浏览器保留使用的 HTTP 方法,从而获得您期望的行为。您对重定向的调用将如下所示:

@mod.route('/payment/', methods=['GET', 'POST'])
def payment():
    if request.method != "POST":
        return render_template('form.html')

    form = request.form

    form_data = {'PAYEE_ACCOUNT': form['PAYEE_ACCOUNT'],
                 'PAYEE_NAME': form['PAYEE_Name'],
                 'PAYMENT_AMOUNT' : form['PAYMENT_AMOUNT']
                 }

    # Save Data

    url = 'http://www.example.com'
    return redirect(url, code=307)

【讨论】:

    【解决方案2】:

    你需要使用flask.redirect

    flask.redirect(位置,代码=302)

    返回一个响应对象(一个 WSGI 应用程序),如果被调用, 将客户端重定向到目标位置。支持的代码是 301, 302、303、305 和 307。不支持 300,因为它不是真实的 重定向和 304,因为它是带有请求的请求的答案 带有已定义的 If-Modified-Since 标头。

    参数:
    location - 响应应该重定向到的位置。 code - 重定向状态代码。默认为 302。

    示例代码:

    import os
    from flask import Flask,redirect
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello():
        return redirect("http://www.example.com", code=302)
    
    if __name__ == '__main__':
        # Bind to PORT if defined, otherwise default to 5000.
        port = int(os.environ.get('PORT', 5000))
        app.run(host='0.0.0.0', port=port)
    

    the documentation on flask docs

    【讨论】:

    • 如何将参数和方法传递给重定向方法?
    【解决方案3】:

    我已经通过使用 JavaScript 解决了这个问题。

    首先,将数据发送到服务器。

    JavaScript 代码:

    <script type="text/javascript">
      var $SCRIPT_ROOT = {{ request.script_root|tojson|safe }};
    
      $(function() {
        $('#PAYMENT_METHOD').bind('click', function() {
          $.getJSON($SCRIPT_ROOT +'/credit/save_transaction', {
            PAYMENT_ID: $('input[name="PAYMENT_ID"]').val(),
            PAYMENT_AMOUNT: $('input[name="PAYMENT_AMOUNT"]').val(),
            SUGGESTED_MEMO: $('input[name="SUGGESTED_MEMO"]').val()
          }, function(data) {
             if (data.result == 'ok') {
                $('#form_payment').submit();
             }
          });
          return false;
        });
      });
    </script>
    

    然后,保存数据并返回结果。

    查看代码:

    @mod.route('/save_transaction', methods=['GET', 'POST'])
    def save_transaction():
        follow_num = request.args.get('PAYMENT_ID')
        amount = request.args.get('PAYMENT_AMOUNT')
        memo = request.args.get('SUGGESTED_MEMO')
    
        #Save Data
    
        return jsonify(result='ok')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 2016-03-27
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多