Crear URL dinámica usando url_for en Flask
Aprenderemos, con esta explicación, qué hace la función url_for()
y cómo podemos crear una URL dinámica en Flask. También aprenderemos a usar url_for()
dentro de la plantilla.
Cree una URL dinámica con la ayuda de la función url_for()
en Flask
url_for()
es una función en Flask que devuelve la URL utilizada para una función de vista particular. Y con esa URL, puede redirigir al usuario a esa página o solo mostrar esa URL.
Para demostrarlo, le mostraremos cómo lo hacemos. Entonces, comencemos a importar Flask junto con url_for
y redirect
.
from flask import Flask, url_for, redirect
Estas son las dos funciones que usaremos en este ejemplo, y luego tendremos una ruta en la vista BASE_FUNC()
.
@app.route("/")
def BASE_FUNC():
return "Hi there,the base index page"
Ahora crearemos otra ruta, a la que llamaremos FIRST_FUNC
, y nos devolverá url_for('BASE_FUNC')
, que es el nombre de otra función. La función url_for()
toma el nombre de la función y devuelve la ruta de esa función que pasamos dentro de la función url_for()
.
@app.route("/first")
def FIRST_FUNC():
return url_for("BASE_FUNC")
Si intentamos acceder a esta ruta, /first
, obtendremos la URL asociada a la función BASE_FUNC()
, lo que significa que obtendremos su ruta. Guardemos esto y ejecutemos el servidor.
Si escribimos este punto final, /first
, solo obtendremos una barra inclinada:
Vamos a crear otra ruta y llamarla /second
con el nombre de función SECOND_FUNC()
, luego devolveremos url_for('THIRD_FUNC', user_name='Harry')
. En un Flask, la ruta incluso funciona con parámetros, por lo que necesitaremos crear otra ruta con un parámetro que sería una cadena.
Crearemos una ruta como esta /tercero/<cadena:nombre_de_usuario>
, y nos aseguraremos de que está utilizando un parámetro con el mismo nombre dentro de la ruta cuando pasó la función url_for()
. Ahora crearemos una nueva función llamada THIRD_FUNC()
y le pasaremos un parámetro con el mismo nombre.
Devolveremos el parámetro user_name
y accederemos a esta función desde la ruta de la otra función usando la función url_for()
.
@app.route("/second")
def SECOND_FUNC():
return url_for("THIRD_FUNC", user_name="Harry")
@app.route("/third/<string:user_name>")
def THIRD_FUNC(user_name):
return "The user name is " + user_name
Si escribimos /segundo
, nos dará la ruta de la función THIRD_FUNC()
:
Podemos usar URL o enlaces para redirigir al usuario a una página específica en la aplicación Flask y ahora, en lugar de devolver solo la URL, podemos redirigir al usuario a una URL en particular. Tendremos que llamar a la función redirect()
, que toma la URL a donde queremos redirigir al usuario.
redirect(url_for("THIRD_FUNC", user_name="Harry"))
Ahora, cuando llamemos a /second
, obtendrá la URL para la ruta /third/<string:user_name>
y nos enviará a esa tercera ruta.
Ahora le mostraremos cómo usar url_for()
dentro de las plantillas usando la plantilla Jinja; Importaremos render_template()
y lo usaremos para renderizar un archivo HTML llamado index.html
. Usaremos otra ruta que devolverá una cadena.
@app.route("/")
def BASE_FUNC():
return render_template("index.html")
@app.route("/page")
def Page_FUNC():
return "Hello"
Crearemos un archivo index.html
dentro de la carpeta de plantillas y luego agregaremos un enlace a la ruta /page
. Pasaremos el Page_FUNC
dentro de url_for()
en lugar de pasar un enlace.
<a href="{{url_for('Page')}}">Page</a>
Guardemos y refresquemos la página:
Ahora lo haremos un poco más complicado; agregaremos un elemento dinámico que se puede pasar junto con /page
que sería el parámetro. Usaremos este parámetro dentro de la plantilla para que el segundo argumento de palabra clave pueda ser cualquier argumento que necesite pasar a esa función de ruta.
En nuestro caso, user_name
sería igual a Josh
:
<a href="{{ url_for('Page_FUNC',user_name='Josh') }}">Page</a>
Producción:
Código fuente completo de Python:
from flask import Flask, url_for, render_template
app = Flask(__name__)
# @app.route("/")
# def BASE_FUNC():
# return "Hi there,the base index page"
# @app.route("/first")
# def FIRST_FUNC():
# return url_for('BASE_FUNC')
# @app.route("/second")
# def SECOND_FUNC():
# return redirect(url_for('THIRD_FUNC', user_name='Harry'))
# @app.route("/third/<string:user_name>")
# def THIRD_FUNC(user_name):
# return "The user name is " + user_name
@app.route("/")
def BASE_FUNC():
return render_template("index.html")
@app.route("/page/<string:user_name>")
def Page_FUNC(user_name):
return "Hello " + user_name
if __name__ == "__main__":
app.run(debug=True)
Código fuente HTML completo:
<html>
<head>
<body>
<h1>Hi User, this is Base page</h1>
<a href="{{ url_for('Page_FUNC',user_name='Josh') }}">Page</a>
</body>
</head>
</html>
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn