2
2
3
3
import tornado .web
4
4
import tornado .httpclient
5
+ import mimetypes
5
6
6
7
class BaseHandler (tornado .web .RequestHandler ):
7
8
def dispatch (self ):
@@ -25,51 +26,98 @@ def head(self):
25
26
def options (self ):
26
27
return self .dispatch ()
27
28
29
+ def is_finish (self ):
30
+ return self ._finished
31
+
32
+ def get_header (self , name ):
33
+ return self ._headers .get (name )
34
+
28
35
class RouterHandler (BaseHandler ):
29
- def initialize (self , router , event_dispatcher ):
36
+ def initialize (self , router , event_dispatcher , logger = None ):
30
37
self .router = router
31
38
self .event_dispatcher = event_dispatcher
39
+ self .logger = logger
32
40
33
41
def dispatch (self ):
34
42
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
36
50
37
51
name , parameters , callback = self .router .match (path_info = self .request .path , method = self .request .method )
38
52
53
+ if self .logger :
54
+ self .logger .debug ("[ioc.extra.tornado.RouterHandler] Match name:%s with parameters:%s (%s)" % (name , parameters , callback ))
55
+
39
56
event = self .event_dispatcher .dispatch ('handler.callback' , {
40
- 'handler' : self ,
57
+ 'request_handler' : self ,
58
+ 'request' : self .request ,
41
59
'name' : name ,
42
60
'callback' : callback ,
43
61
'parameters' : parameters
44
62
})
45
63
64
+ if self .is_finish ():
65
+ return
66
+
46
67
event .get ('callback' )(self , ** event .get ('parameters' ))
47
68
69
+ if self .is_finish ():
70
+ return
71
+
48
72
except NotFound :
49
73
self .set_status (404 )
50
74
self .write ("Not Found" )
51
75
52
76
self .event_dispatcher .dispatch ('handler.not_found' , {
53
- 'handler' : self ,
77
+ 'request_handler' : self ,
78
+ 'request' : self .request ,
54
79
})
55
80
except Exception , e :
56
81
self .set_status (500 )
57
82
self .write ("An unexpected error occurred" )
58
83
59
84
import traceback
60
- traceback .print_exc ( )
85
+ self . write ( "<pre>" + traceback .format_exc () + "</pre>" )
61
86
87
+ print traceback .print_exc ()
62
88
63
89
self .event_dispatcher .dispatch ('handler.exception' , {
64
- 'handler' : self ,
90
+ 'request_handler' : self ,
91
+ 'request' : self .request ,
65
92
})
66
93
94
+ if self .is_finish ():
95
+ return
96
+
67
97
self .event_dispatcher .dispatch ('handler.response' , {
68
- 'handler' : self ,
98
+ 'request_handler' : self ,
99
+ 'request' : self .request ,
69
100
})
70
101
71
- self .finish ()
102
+ if not self .is_finish ():
103
+ self .finish ()
72
104
73
105
self .event_dispatcher .dispatch ('handler.terminate' , {
74
- 'handler' : self ,
106
+ 'request_handler' : self ,
107
+ 'request' : self .request ,
75
108
})
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