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