Page en cours de réécriture
Sommaire
Concept
Le projet django-roa permet de créer un système de sérialisation/dé-sérialisation d'objets en passant par une couche HTTP, tout en maintenant un API compatible avec l'ORM de Django.
La couche HTTP utilise un API REST, et donc peut être consulté facilement depuis nimporte quel environnement.
En plus de l'accès direct aux objets et aux collections, on peut ajouter des paramètres GET pour réstreindre la réponse. Ces paramètres sont les mêmes que pour les querysets, par exemple:
GET /roa/utilisateurs/?filter_email__contains=auf.org
Clients
Client django
Pour faciliter l'utilisation du système de réferences avec Django, un paquet est installable depuis notre serveur Pypi: auf_references_client. En plus de ce paquet, il existe auf_references_modeles, qui est utilisé aussi bien par le serveur que le client.
Ajout de la dépendance
La première étape pour utiliser réferences est d'ajouter le client comme dépendance dans buildout.cfg, par exemple:
[buildout] parts = django find-links = http://pypi.auf.org/django-roa/ http://pypi.auf.org/auf_references_client/ http://pypi.auf.org/auf_references_modeles/ [django] recipe = djangorecipe version = 1.1.1 project = auf_ninja wsgi=true settings=production extra-paths = auf_ninja eggs = django_exportateur auf_references_client
Note: auf_references_modeles doit figurer dans find-links, mais il n'est pas obligatoire dans eggs. Avertissement: Il faut à tout prix que django-roa soit pris depuis notre pypi, il comporte plusieurs changements nécessaires au bon fonctionnement du système.
Il faut ensuite modifier settings.py pour activer et configurer le client:
INSTALLED_APPS += ( 'django_roa', ) ROA_CUSTOM_ARGS = {'api-key': ROA_API_KEY} from auf_references_client.settings import * TEMPLATE_DIRS.extend(REFERENCES_TEMPLATE_DIRS)
API_KEY
Tous les clients de references doivent s'identifier en fournissant une API-KEY, il faut en demander une au responsable du système, en précisant quel est le client, quelles opérations il a besoin de faire, et sur quels objets, et s'il s'agit d'une clé de test ou de production.
Objets
L'utilisation des objects via references se fait de facon transparente:
from auf_references_modeles import Etablissement, Region ameriques = Region.objects.get(nom_court = 'A') etablissements = Etablissement.objects.filter(region = ameriques)
Authentification
Un autre besoin du systeme de réference était d'avoir une source unifiée pour vérifier les comptes utilisateurs. Le paquet auf_references_client fournit un backend d'authentification pour Django.
Pour activer cette authentification, il faut ajouter les lignes suivantes a settings.py:
AUTHENTICATION_BACKENDS = ( 'auf_references_client.backends.CascadeBackend', ) AUTH_PASSWORD_REQUIRED = True USERS_AS_STAFF = False
La variable AUTH_PASSWORD_REQUIRED peut être mise à False si on a besoin de pouvoir tester l'application avec plusieurs comptes utilisateurs.
La variable USERS_AS_STAFF peut être mise à True si on a besoin que tous les utilisateurs aient le flag is_staff à True (pour leur donner accès à l'admin). (Utilisé pour jutda)
Cache (coté client)
L'utilisation de cache est critique pour certains sites, et pour limiter l'utilisation de bande passante. Un système de cache a été ajouté à la version AUF de django-roa.
Pour l'activer, il faut modifier MIDDLEWARE_CLASSES dans settings.py:
MIDDLEWARE_CLASSES = ( 'django.middleware.cache.UpdateCacheMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.cache.FetchFromCacheMiddleware', ....
Note: CommonMiddleware devrait déja être présent, les 2 autres sont à ajouter, dans cet ordre.
Ensuite, on peut spécifier le systeme de cache à utiliser, en ajoutant une ligne dans settings.py:
CACHE_BACKEND = 'memcached://localhost:11211/'
Plus d'informations: django cache.
Client manuel
En guise d'exemple, une méthode rapide pour vérifier un compte utilisateur:
def roa_login (self, email, password): rc = None api_key = "" url = "%s?filter_email=%s&filter_password=%s&format=json&api-key=%s" \ % (self.auf_roa_url, email, password, api_key) try: ud = urllib.urlopen (url) list = simplejson.load (ud) ud.close () rc = list[0] except: rc = None return rc
Note: Ne pas utiliser cette méthode, la gestion d'erreur est très mauvaise.
Serveur
Restrictions
API-KEY
Lister