Modelo do encurtador em FastAPI

Gerado a partir de deploy-templates/fastapi (dado.cloud 18345d5).
This commit is contained in:
dado.cloud
2026-10-21 13:12:41 +00:00
parent 179c4eed10
commit 7006615b91
+18 -2
View File
@@ -8,7 +8,7 @@ troque este arquivo por consultas a um Postgres.
import re import re
import secrets import secrets
from datetime import datetime, timezone from datetime import datetime, timezone
from urllib.parse import urlsplit from urllib.parse import urlsplit, urlunsplit
ALFABETO = "abcdefghijklmnopqrstuvwxyz0123456789" ALFABETO = "abcdefghijklmnopqrstuvwxyz0123456789"
TAMANHO_CODIGO = 6 TAMANHO_CODIGO = 6
@@ -44,11 +44,27 @@ def _validar_url(valor) -> str:
raise ErroDeValidacao(f"Esse link é comprido demais (máximo de {TAMANHO_MAXIMO_URL} caracteres).") raise ErroDeValidacao(f"Esse link é comprido demais (máximo de {TAMANHO_MAXIMO_URL} caracteres).")
try: try:
partes = urlsplit(texto) partes = urlsplit(texto)
porta = partes.port # porta inválida (ex.: ":abc") levanta ValueError
except ValueError: except ValueError:
partes = None partes = None
if not partes or partes.scheme not in ("http", "https") or not partes.hostname or any(c.isspace() for c in texto): if not partes or partes.scheme not in ("http", "https") or not partes.hostname or any(c.isspace() for c in texto):
raise ErroDeValidacao("Esse não parece um link válido. Use um endereço que comece com http:// ou https://.") raise ErroDeValidacao("Esse não parece um link válido. Use um endereço que comece com http:// ou https://.")
return texto return _normalizar(partes, porta)
def _normalizar(partes, porta) -> str:
"""Mesma forma que o `new URL(...).href` dos modelos Node: esquema e host em
minúsculas, sem a porta padrão e com "/" quando o caminho vem vazio."""
esquema = partes.scheme.lower()
host = partes.hostname.lower()
if ":" in host: # IPv6 volta entre colchetes
host = f"[{host}]"
if porta is not None and porta != {"http": 80, "https": 443}[esquema]:
host = f"{host}:{porta}"
if partes.username is not None:
credenciais = partes.username + (f":{partes.password}" if partes.password is not None else "")
host = f"{credenciais}@{host}"
return urlunsplit((esquema, host, partes.path or "/", partes.query, partes.fragment))
def criar_link(valor) -> dict: def criar_link(valor) -> dict: