Create dynamic URLs in Flask with url_for()

PythonFlask

Python Problem Overview


Half of my Flask routes requires a variable say, /<variable>/add or /<variable>/remove. How do I create links to those locations?

url_for() takes one argument for the function to route to but I can't add arguments?

Python Solutions


Solution 1 - Python

It takes keyword arguments for the variables:

url_for('add', variable=foo)
url_for('remove', variable=foo)

The flask-server would have functions:

@app.route('/<variable>/add', methods=['GET', 'POST'])
def add(variable):

@app.route('/<variable>/remove', methods=['GET', 'POST'])
def remove(variable):

Solution 2 - Python

url_for in Flask is used for creating a URL to prevent the overhead of having to change URLs throughout an application (including in templates). Without url_for, if there is a change in the root URL of your app then you have to change it in every page where the link is present.

Syntax: url_for('name of the function of the route','parameters (if required)')

It can be used as:

@app.route('/index')
@app.route('/')
def index():
    return 'you are in the index page'

Now if you have a link the index page:you can use this:

<a href={{ url_for('index') }}>Index</a>

You can do a lot o stuff with it, for example:

@app.route('/questions/<int:question_id>'):    #int has been used as a filter that only integer will be passed in the url otherwise it will give a 404 error
def find_question(question_id):  
    return ('you asked for question{0}'.format(question_id))

For the above we can use:

<a href = {{ url_for('find_question' ,question_id=1) }}>Question 1</a>

Like this you can simply pass the parameters!

Solution 3 - Python

Refer to the Flask API document for flask.url_for()

Other sample snippets of usage for linking js or css to your template are below.

<script src="{{ url_for('static', filename='jquery.min.js') }}"></script>

<link rel=stylesheet type=text/css href="{{ url_for('static', filename='style.css') }}">

Solution 4 - Python

Templates:

Pass function name and argument.

<a href="{{ url_for('get_blog_post',id = blog.id)}}">{{blog.title}}</a>

View,function

@app.route('/blog/post/<string:id>',methods=['GET'])
def get_blog_post(id):
    return id

Solution 5 - Python

You need to add function means that the page you want to render that function whould be added inside the url_for(function name). It will redirect to that function and the page will render accordingly.

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
QuestionGio BorjeView Question on Stackoverflow
Solution 1 - PythonFogleBirdView Answer on Stackoverflow
Solution 2 - PythonHiroView Answer on Stackoverflow
Solution 3 - Pythonthirumalaa srinivasView Answer on Stackoverflow
Solution 4 - PythonMuhammad Faizan FareedView Answer on Stackoverflow
Solution 5 - PythonyuviscorView Answer on Stackoverflow