Link Search Menu Expand Document
El Libro De Python (24.95 €) 39.95 €

Acortador de enlaces con flask

Veamos como implementar un servicio para acortar enlaces, como el que puedes ver en redes sociales o webs. Acortar enlaces permite ahorrar caracteres en tus mensajes y permite pasar:

  • 👖 De una URL larga
    https://www.ejemplo.com/con/url/muy/larga/y/muchos/parametros
  • 🩳 A una URL corta http://servidor:5000/6231aa1.

Para que esto funcione es necesario un servicio que recuerde la relación entre ambas URL. Es decir, que cuando alguien intente acceder a la corta, se redirija a la larga.

  • El servidor almacena la relación 🩳  👖.

En este ejemplo vamos a implementar un servicio web con flask que nos permita acortar URL. Tendremos dos endpoints:

  • acorta: Dada una URL larga, nos devuelve una corta y almacena la relación.
  • /: Dada una URL corta, usando la relación almacenada, nos redirige a la larga.
from flask import Flask, request, redirect
import hashlib

app = Flask(__name__)
url_map = {}

@app.route('/acorta', methods=['POST'])
def shorten_url():
    url_larga = request.form['url']
    url_corta = acorta_url(url_larga)
    url_map[url_corta] = url_larga
    return f'Acortada: {url_larga} -> {url_corta}'

@app.route('/<url_corta>')
def corta_a_larga(url_corta):
    url_larga = url_map.get(url_corta)
    if url_larga:
        return redirect(url_larga)
    else:
        return 'No encontrada!', 404

def acorta_url(full_url):
    hashed = hashlib.sha256(full_url.encode()).hexdigest()
    return hashed[:7]

if __name__ == '__main__':
    app.run(debug=True)

Veamos el ejemplo en acción. Si instalas curl puedes hacer lo siguiente. Esto realiza una petición a tu aplicación indicando que quieres acortar la dirección de Google. Y almacena la URL corta 253d142.

curl -X POST -d "url=http://www.google.com" http://localhost:5000/acorta
# Acortada: http://www.google.com -> 253d142

Ahora en tu navegador si pones http://localhost:5000/253d142 podrás ver como te redirige a Google.

✏️ Ejercicios:

  • Usa el paquete sqlite3 para persistir la información de url_map si la aplicación se reinicia. Es decir, tal como está ahora si se reinicia la aplicación se perderán las URL acortadas. Persiste esa información en disco y cárgala al iniciar.