I have a jinja2 template which I reuse for different Flask routes. All of these routes have a single required parameter and handle only GET requests, but some routes may have extra arguments.
Is there a way to append extra arguments onto url_for()?
Something like
url_for(my_custom_url, oid=oid, args=extra_args)
which will render to (depending on the route endpoint):
# route 'doit/<oid>' with arguments doit/123?name=bob&age=45 # route 'other/<oid>' without arguments other/123
My use case would be to provide links with predefined query arguments:
<a href=" {{ url_for('doit', oid=oid, args=extra_args }} " rel="nofollow noreferrer noopener">A specific query</a>
<a href=" {{ url_for('other', oid=oid) }} " rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener">A generic query</a>
I would like to run this template without JavaScript, so I would not like to assign a click listener and use AJAX to do a GET request for each link if that is possible.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Any arguments that don’t match route parameters will be added as the query string. Assuming extra_args is a dict, just unpack it.
extra_args = {'hello': 'world'}
url_for('doit', oid=oid, **extra_args)
# /doit/123?hello=world
url_for('doit', oid=oid, hello='davidism')
# /doit/123?hello=davidism
Then access them in the view with request.args:
@app.route('/doit/<int:oid>')
def doit(oid)
hello = request.args.get('hello')
...
Method 2
Using your example, this wound generate the URLs like you requested if you know your arguments in advance.
<a href=" {{ url_for('doit', oid=oid, name='bob', age=45 }} " rel="nofollow noreferrer noopener">A specific query</a>
<a href=" {{ url_for('other', oid=oid) }} " rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener">A generic query</a>
@davidism’s answer would be preferred if your set of arguments isn’t known until runtime and are stored in a dictionary.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0