I'm trying to understand how best to redirect and pass arguments using Flask
Below is my code, I'm finding that x
and y
are not making it into the template.
Is my syntax correct? Am I missing something basic? I am able to render the template, but I want to redirect to the url /found
, rather than just returning the template for find.html
@app.route('/found') def found(email,listOfObjects): return render_template("found.html", keys=email,obj=listOfObjects) @app.route('/find', methods=['GET','POST']) def find(): if request.method == 'POST': x = 3 y = 4 return redirect(url_for('found',keys=x,obj=y)) return render_template("find.html")
Then we call redirect with the URL to redirect to the /found/<email>/<list_of_objects> route. To pass arguments into redirect (url_for ()) of Flask, we define the destination route to get the request parameters.
Flask URL parameters is defined as a set of arguments in form of a query string that is passed to a web application through Flask. These parameters get bonded to the URL.
In the first one we would use request.args.get (‘<argument name>’) where request is the instance of the class request imported from Flask. Args is the module under which the module GET is present which will enable the retrieve of the parameters. And finally, we need to replace <argument name> with the argument/variable we want the value of.
Now in order to retrieve the key from query, we have 2 ways, with both of them having some subtle differences. In the first one we would use request.args.get (‘<argument name>’) where request is the instance of the class request imported from Flask.
The redirect is fine, the problem is with the found
route. You have several ways to pass values to an endpoint: either as part of the path, in URL parameters (for GET requests), or request body (for POST requests).
In other words, your code should look as follows:
@app.route('/found/<email>/<listOfObjects>') def found(email, listOfObjects): return render_template("found.html", keys=email, obj=listOfObjects)
Alternatively:
@app.route('/found') def found(): return render_template("found.html", keys=request.args.get('email'), obj=request.args.get('listOfObjects'))
Also, your redirection should provide request parameters, not template parameters:
return redirect(url_for('found', email=x, listOfObjects=y))
Hope that helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With