Descargar

Validar datos

import validate comprueba si un dato tiene la forma correcta: correos, webs, teléfonos, documentos españoles (DNI, NIE) con su letra de control, IBAN, tarjetas, ISBN, códigos postales, fechas... Y también comprueba un formulario o un JSON entero con un esquema de reglas, con los mensajes de error en español.

import validate

print(validate.email("ana@ejemplo.es"))                 // true
print(validate.dni("12345678Z"))                        // true: la letra es la correcta
print(validate.dni("12345678A"))                        // false
print(validate.iban("ES91 2100 0418 4502 0005 1332"))   // true: dígitos de control (módulo 97)
print(validate.card("4539 1488 0343 6467"))             // true: algoritmo de Luhn
print(validate.dniLetter(12345678))                     // Z
▶ Probar en el editor

Comprobadores

FunciónComprueba
email(t)un correo con forma válida (nombre@dominio.es)
url(t)una dirección http:// o https://
phone(t, pais = "ES")un teléfono español (9 cifras que empiezan por 6, 7, 8 o 9, con +34 opcional); con otro país, de 7 a 15 cifras
dni(t) · nie(t) · nif(t)DNI (12345678Z), NIE (X1234567L) o cualquiera de los dos, con la letra de control
dniLetter(numero)la letra que le corresponde a un número de DNI
iban(t)un IBAN: país, longitud y dígitos de control
card(t)un número de tarjeta (12 a 19 cifras, algoritmo de Luhn)
isbn(t)un ISBN-10 o ISBN-13
postalCode(t, pais = "ES")un código postal español (01000 a 52999)
hexColor(t)un color #f80, #ff8800 o #ff8800cc
date(t)una fecha real AAAA-MM-DD (con los días de cada mes y los bisiestos)
strongPassword(t, minimo = 8)una contraseña con minúsculas, mayúsculas y números

Los espacios, guiones y puntos del medio no importan: "12.345.678-Z" y "ES91 2100 ..." valen.

Formularios y JSON: check

validate.check(datos, reglas) devuelve un mapa {campo: "error"} solo con los campos que fallan; si todo está bien, el mapa está vacío.

import validate

var reglas = {
    nombre: { required: true, min: 2 },
    edad: { type: "number", min: 18, max: 120 },
    correo: "email",                       // atajo de { type: "email", required: true }
    rol: { oneOf: ["admin", "jugador"] },
    alias: { pattern: r"[a-z0-9_]{3,12}", message: "solo minúsculas, números y _" },
}
var errores = validate.check({ nombre: "A", edad: "15", correo: "x@", rol: "rey", alias: "Ana!" }, reglas)
foreach campo, error in errores { print("${campo:<8} ${error}") }
▶ Probar en el editor
nombre   debe tener al menos 2 caracteres
edad     debe ser como mínimo 18
correo   no es un email válido
rol      debe ser uno de: admin, jugador
alias    solo minúsculas, números y _
ReglaQué pide
required: trueque el campo exista y no esté vacío (sin required, un campo vacío vale)
type"text", "number" (también un texto con un número, como los de un formulario), "integer", "bool", "list", "map" o cualquier comprobador: "email", "url", "phone", "dni", "nie", "nif", "iban", "card", "isbn", "postalCode", "hexColor", "date"
min · maxel valor (números) o la longitud (textos, listas y mapas)
patternuna expresión regular que debe cumplir todo el texto
oneOfuna lista de valores permitidos
customuna función: devuelve true si vale, o false o un texto con el error
messageel mensaje que se muestra en lugar del de serie

También están validate.valid(datos, reglas) (true o false) y validate.ensure(datos, reglas), que lanza un Error con todos los fallos juntos y, si todo está bien, devuelve los datos.

En una web

Junto con web.form comprueba lo que envía un formulario antes de usarlo:

import web
import validate

var app = web.App()
app.post("/registro", req => {
    var datos = web.form(req)
    var errores = validate.check(datos, { correo: "email", edad: { type: "number", min: 18 } })
    if not errores.isEmpty() { return web.json({ errores: errores }, 422) }
    return web.html("¡Bienvenido!")
})
print(app.handle(web.request("POST", "/registro", "correo=ana@ejemplo.es&edad=20")).body)
▶ Probar en el editor