22
33import tornado .web
44import tornado .httpclient
5+ import mimetypes
56
67class BaseHandler (tornado .web .RequestHandler ):
78 def dispatch (self ):
@@ -25,51 +26,98 @@ def head(self):
2526 def options (self ):
2627 return self .dispatch ()
2728
29+ def is_finish (self ):
30+ return self ._finished
31+
32+ def get_header (self , name ):
33+ return self ._headers .get (name )
34+
2835class RouterHandler (BaseHandler ):
29- def initialize (self , router , event_dispatcher ):
36+ def initialize (self , router , event_dispatcher , logger = None ):
3037 self .router = router
3138 self .event_dispatcher = event_dispatcher
39+ self .logger = logger
3240
3341 def dispatch (self ):
3442 try :
35- self .event_dispatcher .dispatch ('handler.request' , {'handler' : self })
43+ self .event_dispatcher .dispatch ('handler.request' , {
44+ 'request_handler' : self ,
45+ 'request' : self .request
46+ })
47+
48+ if self .is_finish ():
49+ return
3650
3751 name , parameters , callback = self .router .match (path_info = self .request .path , method = self .request .method )
3852
53+ if self .logger :
54+ self .logger .debug ("[ioc.extra.tornado.RouterHandler] Match name:%s with parameters:%s (%s)" % (name , parameters , callback ))
55+
3956 event = self .event_dispatcher .dispatch ('handler.callback' , {
40- 'handler' : self ,
57+ 'request_handler' : self ,
58+ 'request' : self .request ,
4159 'name' : name ,
4260 'callback' : callback ,
4361 'parameters' : parameters
4462 })
4563
64+ if self .is_finish ():
65+ return
66+
4667 event .get ('callback' )(self , ** event .get ('parameters' ))
4768
69+ if self .is_finish ():
70+ return
71+
4872 except NotFound :
4973 self .set_status (404 )
5074 self .write ("Not Found" )
5175
5276 self .event_dispatcher .dispatch ('handler.not_found' , {
53- 'handler' : self ,
77+ 'request_handler' : self ,
78+ 'request' : self .request ,
5479 })
5580 except Exception , e :
5681 self .set_status (500 )
5782 self .write ("An unexpected error occurred" )
5883
5984 import traceback
60- traceback .print_exc ( )
85+ self . write ( "<pre>" + traceback .format_exc () + "</pre>" )
6186
87+ print traceback .print_exc ()
6288
6389 self .event_dispatcher .dispatch ('handler.exception' , {
64- 'handler' : self ,
90+ 'request_handler' : self ,
91+ 'request' : self .request ,
6592 })
6693
94+ if self .is_finish ():
95+ return
96+
6797 self .event_dispatcher .dispatch ('handler.response' , {
68- 'handler' : self ,
98+ 'request_handler' : self ,
99+ 'request' : self .request ,
69100 })
70101
71- self .finish ()
102+ if not self .is_finish ():
103+ self .finish ()
72104
73105 self .event_dispatcher .dispatch ('handler.terminate' , {
74- 'handler' : self ,
106+ 'request_handler' : self ,
107+ 'request' : self .request ,
75108 })
109+
110+
111+ def send_file (self , file ):
112+ """
113+ Send a file to the client, it is a convenient method to avoid duplicated code
114+ """
115+ mime_type , encoding = mimetypes .guess_type (file )
116+
117+ if mime_type :
118+ self .set_header ('Content-Type' , mime_type )
119+
120+ fp = open (file , 'r' )
121+ self .write (fp .read ())
122+
123+ fp .close ()
0 commit comments