ajout filtre json ; systeme de template dans .py a part
[restcoda.git] / rest.py
... / ...
CommitLineData
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3
4import sys, traceback
5
6# configuration (codes d'accès à la base MS-SQL)
7sys.path.append('/home/thomas/public_html/')
8import rest_config
9
10# pour savoir quel objet interroger : Routes
11from routes import Mapper
12from routes.middleware import RoutesMiddleware
13
14# Gestion des erreurs
15from jinja.exceptions import TemplateNotFound
16from objet import ObjetInconnu
17
18# TODO : ajouter un middleware de cache (beaker, basé sur REQUEST_URI quand la methode est GET)
19# from beaker.middleware import CacheMiddleware
20
21# content-type correspondant a certains formats
22contenttype = { 'xml': 'application/xml',
23 'rss': 'application/rss+xml',
24 'html': 'text/html',
25 'txt': 'text/plain',
26 'json': 'text/plain', # 'application/json',
27 'csv': 'text/csv',
28 'debug': 'text/plain' }
29
30# les routes RESTful (cf http://routes.groovie.org/manual.html#restful-services)
31mapper = Mapper()
32mapper.resource('demlog','demlog')
33mapper.resource('comlog','comlog')
34mapper.resource('demdep','demdep')
35mapper.resource('comdep','comdep')
36mapper.resource('dempub','dempub')
37mapper.resource('compub','compub')
38mapper.resource('comare','comare')
39mapper.resource('comarei','comare:(impl)',controller='comare') # pour les comarexxx où xxx est un code d'implantation
40mapper.resource('comsre','comsre')
41mapper.resource('comsrei','comsre:(impl)',controller='comsre')
42mapper.resource('comxre','comxre') # comxre = comare + comsre
43mapper.resource('comxrei','comxre:(impl)',controller='comxre')
44mapper.resource('dem','dem')
45mapper.resource('com','com')
46mapper.resource('utilisateur','utilisateur')
47mapper.resource('fournisseur','fournisseur')
48mapper.resource('budget','budget')
49
50# objets disponibles
51from document import demlog, comlog, demdep, comdep, dempub, compub, comare, comsre, comxre, dem, com
52from utilisateur import utilisateur
53from fournisseur import fournisseur
54from budget import budget
55
56def dispatcher(environ, start_response):
57 """dispatch vers la bonne methode du bon objet, et retour WSGI"""
58 results = environ['wsgiorg.routing_args'][1] # résultat du middleware Routes
59 try:
60 # On cherche l'objet puis la méthode
61 target_class = globals()[results['controller']]
62 method = getattr(target_class,results['action'])
63 except:
64 # Si erreur pendant la recherche, on renvoie un 501
65 start_response("501 Not Implemented", [('Content-type', 'text/html; charset=utf-8')])
66 return '<html><body><h2>501 objet ou action invalide</h2></body></html>' # <pre>%s: %s\n%s</pre></body></html>' % ( sys.exc_info()[0] , sys.exc_info()[1] , traceback.format_exc())
67 try:
68 # On lance la méthode et on renvoie le résultat
69 type, output = method(target_class(environ))
70 start_response("200 OK", [('Content-type', contenttype.get(type,'text/plain') + "; charset=utf-8")])
71 return output.encode('utf-8')
72 # gestion des problèmes possibles pendant l'exécution
73 except ObjetInconnu, type:
74 start_response("404 Not Found", [('Content-type', 'text/html; charset=utf-8')])
75 return '<html><body><h2>404 %s inexistant</h2></body></html>' % type
76 except TemplateNotFound, template:
77 start_response("415 Unsupported Media Type", [('Content-type', 'text/html; charset=utf-8')])
78 return '<html><body><h2>415 format non supporté (%s inexistant)</h2></body></html>' % template
79 except:
80 start_response("500 INTERNAL ERROR", [('Content-type', 'text/html; charset=utf-8')])
81 return '<html><body><h2>500 erreur lors du traitement</h2><pre>%s: %s\n%s</pre></body></html>' % ( sys.exc_info()[0] , sys.exc_info()[1] , traceback.format_exc())
82
83
84# application() sera lancée par mod_wsgi : on route et on dispatche
85application = RoutesMiddleware( dispatcher, mapper )
86
87