How can I pass arguments into redirect(url_for()) of Flask?

Python 2.7Flask

Python 2.7 Problem Overview


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

Python 2.7 Solutions


Solution 1 - Python 2.7

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionshartshooterView Question on Stackoverflow
Solution 1 - Python 2.7Adam ByrtekView Answer on Stackoverflow