How to redirect to an external url with parameters and POST method?

17,703

Solution 1

I've solved this problem by using JavaScript.

First, sending the data to server.

JavaScript code:

<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>

Then, saving the data and returning result.

View code:

@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')

Solution 2

Sending a 307 status code instead of 302 should tell the browser to preserve the used HTTP method and thus have the behavior you're expecting. Your call to redirect would then look like this:

@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)
Share:
17,703
Majid Zandi
Author by

Majid Zandi

python developer. (Don’t worry about your choices: just build something.)

Updated on June 04, 2022

Comments

  • Majid Zandi
    Majid Zandi almost 2 years

    I want save form data before submit to action url in flask

    <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>
    

    I can submit this form, but i want save form data before submit

    View:

    @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)
    

    Please help me

  • Majid Zandi
    Majid Zandi over 9 years
    how to pass parameter and method to redirect method?