Buscar..


Rutas Básicas

Las rutas en Flask se pueden definir utilizando el decorador de route de la instancia de la aplicación Flask:

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello Flask'

El decorador de route toma una cadena que es la URL para que coincida. Cuando la aplicación recibe una solicitud de una URL que coincide con esta cadena, se invocará la función decorada (también llamada función de vista ). Así que para una ruta tendríamos:

@app.route('/about')
def about():
    return 'About page'

Es importante tener en cuenta que estas rutas no son expresiones regulares como lo son en Django.

También puede definir reglas de variables para extraer valores de segmento de URL en variables:

@app.route('/blog/posts/<post_id>')
def get_blog_post(post_id):
    # look up the blog post with id post_id
    # return some kind of HTML

Aquí la regla de la variable está en el último segmento de la URL. Cualquier valor que se encuentre en el último segmento de la URL se pasará a la función de vista ( get_blog_post ) como el parámetro post_id . Por lo tanto, una solicitud para /blog/posts/42 recuperará (o intentará recuperar) la publicación del blog con un ID de 42.

También es común reutilizar las URL. Por ejemplo, tal vez queremos que /blog/posts devuelva una lista de todas las publicaciones de blog. Entonces podríamos tener dos rutas para la misma función de vista:

@app.route('/blog/posts')
@app.route('/blog/posts/<post_id>')
def get_blog_post(post_id=None):
    # get the post or list of posts

Tenga en cuenta que también tenemos que proporcionar el valor predeterminado de None para el post_id en get_blog_post . Cuando la primera ruta coincida, no habrá ningún valor para pasar a la función de vista.

También tenga en cuenta que, de forma predeterminada, el tipo de una regla variable es una cadena. Sin embargo, puede especificar varios tipos diferentes, como int y float prefijando la variable:

@app.route('/blog/post/<int:post_id>')

Los convertidores de URL incorporados de Flask son:

string | Accepts any text without a slash (the default).
int    | Accepts integers.
float  | Like int but for floating point values.
path   | Like string but accepts slashes.
any    | Matches one of the items provided
uuid   | Accepts UUID strings

Si intentamos visitar la URL /blog/post/foo con un valor en el último segmento de URL que no se puede convertir en un entero, la aplicación devolverá un error 404. Esta es la acción correcta porque no hay una regla con /blog/post y una cadena en el último segmento.

Finalmente, las rutas también pueden configurarse para aceptar métodos HTTP. El decorador de route toma un argumento de palabra clave de methods que es una lista de cadenas que representan los métodos HTTP aceptables para esta ruta. Como puede haber asumido, el valor predeterminado es GET solamente. Si tuviéramos un formulario para agregar una nueva publicación de blog y quisiéramos devolver el HTML para la solicitud GET y analizar los datos del formulario para la solicitud POST , la ruta se vería así:

@app.route('/blog/new', methods=['GET', 'POST'])
def new_post():
    if request.method == 'GET':
        # return the form
    elif request.method == 'POST':
        # get the data from the form values

La request se encuentra en el paquete flask . Tenga en cuenta que al utilizar el argumento de palabras clave de methods , debemos ser explícitos sobre los métodos HTTP para aceptar. Si hubiéramos enumerado solo POST , la ruta ya no respondería a las solicitudes GET y devolvería un error 405.

Ruta de todo

Puede ser útil tener una vista general donde usted mismo maneje la lógica compleja basada en la ruta. Este ejemplo utiliza dos reglas: la primera regla específicamente detecta / y la segunda regla detecta rutas arbitrarias con el convertidor de path incorporado. El convertidor de path coincide con cualquier cadena (incluidas las barras) Ver reglas variables de matraz

@app.route('/', defaults={'u_path': ''})
@app.route('/<path:u_path>')
def catch_all(u_path):
    print(repr(u_path))
    ...
c = app.test_client()
c.get('/')  # u_path = ''
c.get('/hello')  # u_path = 'hello'
c.get('/hello/stack/overflow/')  # u_path = 'hello/stack/overflow/'

Métodos de enrutamiento y HTTP

Por defecto, las rutas solo responden a las solicitudes GET . Puede cambiar este comportamiento proporcionando el argumento de methods al decorador route() .

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        do_the_login()
    else:
        show_the_login_form()

También puede asignar diferentes funciones al mismo punto final según el método HTTP utilizado.

@app.route('/endpoint', methods=['GET'])
def get_endpoint():
    #respond to GET requests for '/endpoint'


@app.route('/endpoint', methods=['POST', 'PUT', 'DELETE'])
def post_or_put():
    #respond to POST, PUT, or DELETE requests for '/endpoint'


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow