Herramientas web2pyTM
Desde la versión 1.56 web2py incluye herramientas para autenticación, autorización, ABM (CRUD), servicios web, y más. Son implementadas para no requerir JOINs y por lo tanto funcionan también en Google App Engine.
Autenticación
La herramienta básica de autenticación es la clase Auth. Provee métodos que pueden ser usados como acciones de controlador para registrar usuarios (opcionalmente con soporte Recaptcha), registrar su acceso y egreso (iniciar sesión), permitir verificación por correo electrónico, cambio, restablecimiento y recuperación de contraseña, edición del perfil de usuario.
Estas funcionalidades pueden ser usadas como las bases para autorización.
Las llamadas a Auth pueden ser extendidas, personalizadas, y reemplazadas por otros mecanismos de autenticación que expongan una interfaz similar.
Para usar autenticación, escribir algo parecido a esto en el archivo del modelo:
1. | from gluon.tools import Mail, Auth, Recaptcha |
En su controlador (por ejemplo en default.py) exponer los objetos auth (por ejemplo vía una acción user):
1. | def user(): |
La acción de arriba expondrá las siguientes URLs
- http://locahost:8000/application/default/user/register
- http://locahost:8000/application/default/user/login
- http://locahost:8000/application/default/user/logout
- http://locahost:8000/application/default/user/verify_email
- http://locahost:8000/application/default/user/profile
- http://locahost:8000/application/default/user/change_password
- http://locahost:8000/application/default/user/retrieve_password
- http://locahost:8000/application/default/user/groups
La página groups muestra una lista de los roles y la descripción para los grupos en el que el usuario que inició sesión es miembro (ver autorización).
Puede verificar si un usuario inició sesión vía auth.is_logged_in(). Si un usuario inicio sesión su información de registro puede ser encontrada en auth.user. Por defecto un usuario es almacenado en la tabla llamada "auth_user" y tiene las siguientes columnas: first_name, last_name, email, password. La contraseña es almacenada encriptada (md5 hashed o superior). Puede cambiar el nombre de la tabla, definir su propia tabla con más campos, requerir validadores adicionales.
Todos los eventos de autenticación son registrados en una tabla llamada "auth_event".
Autenticación Personalizada
Puede personalizar el objeto auth cambiando sus ajustes y mensajes:
1. | auth.messages.access_denied = 'Privilegios insuficientes' |
Las cadenas pueden ser traducidas ende la maera usual aún si no hay un operador T
Las vistas pueden ser manejadas de la forma habitual de web2pyViews are handled the usual web2py way.
También es posible usar tablas personalizadas. Por ejemplo una tabla de usuario personalizada:
1. | # instanciar auth |
Uno puede agregar cualquier otro campo que se necesita siempre y cuando los campos en el ejemplo esten allí.
Autorización
Una vez que tenga identificado al usuario por el user.id, puede crear un grupo (por ejemplo "Administrador")
group_id = auth.add_group(role = "Administrador", description = "ejemplo de grupo") |
y hacerlo miembro al usuario:
auth.add_membership(group_id,user_id) |
y asignarle permisos a todos los miembros del grupo:
auth.add_permission(group_id,'create','tablename',record_id) |
Luego puede hacer cumplir los permisos usando los siguientes decoradores:
1. | auth.settings.on_failed_authorization=URL(r=request,f='error') |
Los roles de grupo son convencionales. Los nombres de permisos son también convencionales. Si un grupo tiene ciertos permisos en el record_id==0 (predeterminado), significa que el usuario tiene permisos sobre cualquier registro.
Algunos nombres de permisos ("tables", "select", "create", "update", "delete", "read") tienen un significado especial ya que pueden ser automáticamente comprobados por la herramienta ABM descripta abajo.
Altas/Bajas y Modificaciones (Create/Read/Update/Delete y más)
Para usar CRUD (ABM), en su modelo inserte el siguiente código:
1. | from gluon.tools import Crud |
y en uun controlador (por ejemplo en default.py) expongalo vía una acción (por ejemplo data):
1. | def data(): |
Esto expondrá las siguientes URLs:
- http://locahost:8000/application/default/data/tables
- http://locahost:8000/application/default/data/select/tablename
- http://locahost:8000/application/default/data/create/tablename
- http://locahost:8000/application/default/data/read/tablename/record_id
- http://locahost:8000/application/default/data/update/tablename/record_id
- http://locahost:8000/application/default/data/delete/tablename/record_id
- http://locahost:8000/application/default/download/filename
"tables" lista las tablas de la base de datos actual.
"download" solo permite bajar archivos subidos (tanto si estan en la carpeta de subidas o en la base de datos).
Para hacer cuplir la autorización en estas URLs CRUD simplemente establezca
1. | crud.settings.auth=auth |
y el usuario con sesión iniciada solo será capaz de "create" (crear) un registro en la tabla "tablename" si el usuario es miembro del grupo que tiene permisos "create" en la tabla "tablename". El mismo mecanismo funciona para URLs "tables", "select", "read", "update", y "delete".
Servicios
Web2py provee una interfaz para exponer cualquier función como un servicio (CSV, XML, JSON, XMLRPC, JSONRPC, AMF)
Esto se logra en tres pasos:- Crear una instancia del objeto Service en un modelo o controlador
1.
2.from gluon.tools import Service
service = Service(globals()) - Exponer el objeto vía una acción llamada, por ejemplo, 'call'
1.
def call(): return service()
- Devore todas las funciones que desea exponer, usando uno omás de los siguientes decoradores
1.
2.
3.
4.
5.
6.
7.
8.@service.run
@service.csv
@service.xml
@service.json
@service.xmlrpc
@service.jsonrpc
@service.pyamf
def myfunction(a,b): return a+b
La función puede ahora ser llamada remotamente usando la sintaxis
1. | http://..../app/default/call/[method]/[function]/[arguments] |
1. | http://..../app/default/call/[method]/[function]?[arguments] |
1. | http://..../app/default/call/run/myfunction/2/3 |
1. | http://..../app/default/call/run/myfunction?a=2&b=3 |
Salvedades: csv solo funciona si la función regresa una lista de listas. amfrpc solo funciona si PyAMF está instalado. En el caso de xmlrpc, jsonrpc y amfrpc, los argumentos arguments (/myfunction/2/3) no pueden ser pasados en la URI, deben ser pasados de acurdo al protocolo respectivo. Por ejemplpo para xmlrpc desde otro programa python:
1. | >>> from xmlrpclib import ServerProxy |
Traer una URL
El módulo Python urllib no funciona bien en Google App Engine. Por esta razón hemos creado una función portable para traer url que funciona en todas partes, incluyendo GAE:
1. | from gluon.tools import fetch |
Codificación Geográfica (geocoding)
Otra forma muy com´´un de aplicaciones web moderas es vonvertir una dirección a una longitud y latitud. Tambien proveemos una función portable para hacerlo que usa la API de Google Geocoding:
1. | from gluon.tools import geocode |
Devuelve 0,0 si hay falla.