1010from quickpython .component .function import *
1111from quickpython .component .result import Result
1212from .exception import *
13- from .contain import Controller , Request , HandlerHelper
13+ from .contain import Controller , Request , Response , HandlerHelper
1414
1515logger = logging .getLogger (__name__ )
1616logger .setLevel (logging .INFO )
1717encoding = Config .SETTINGS ['encoding' ]
1818DS = r"/"
1919
2020
21- class ProcessorHandler (web .RequestHandler ):
21+ class Application :
22+ pass
2223
23- executor = ThreadPoolExecutor (max_workers = Config .web_thr_count (Config .SETTINGS ['pro_thr_num' ]))
2424
25- def __init__ (self , application : "Application" , request : httputil .HTTPServerRequest , ** kwargs : Any ):
26- super ().__init__ (application , Request (request ), ** kwargs )
25+ class QuickPythonHandler :
26+
27+ def __init__ (self , application : Application , request : Request , hdl = None ):
28+ self .application = application
29+ self .request = request
30+ self .response = Response ()
31+ self ._hdl = hdl # tornado的hdl
2732 self .params = {} # 收集到的请求参数
28- self .path = '/' # 请求路径
29- self .path_arr = [] # 请求路径分割数组
33+ self ._is_finish = False
3034
31- def data_received (self , chunk : bytes ) -> Optional [Awaitable [None ]]:
32- pass
35+ @classmethod
36+ def action (cls , path , header = None , data = None ):
37+ """本地接口直接调用"""
3338
34- @tornado .gen .coroutine
35- def get (self , * args , ** kwargs ):
36- self .request .method = 'GET'
37- resp_content = yield self ._dispose (* args )
38- if resp_content is True :
39- self .finish ()
40- return
41- if self .response_write (resp_content ) is False : # =False是未处理
42- self .finish ()
43- return
39+ def __dispose__ (self ):
40+ try :
41+ ret = self .__dispose ()
42+ except BaseException as e :
43+ ret = e
4444
45- @tornado .gen .coroutine
46- def post (self , * args , ** kwargs ):
47- self .request .method = 'POST'
48- resp_content = yield self ._dispose (* args )
49- if resp_content is True :
50- self .finish ()
51- return
52- if self .response_write (resp_content ) is False : # =False是未处理
53- self .finish ()
54- return
45+ if ret is not None :
46+ self .response_write (ret )
5547
56- @run_on_executor
57- def _dispose (self , * args ):
48+ self .finish ()
49+
50+ def __dispose (self ):
51+ ret = None
5852 try :
59- # 初始数据
53+ # 初始
54+ request = self .request
6055 self ._on_mtime = int (time .time () * 1000 )
6156 self ._is_finish = False # 请求是否结束
6257 self ._is_res_request = False # 是否是资源请求
6358 # 请求处理
64- HandlerHelper . before ( self )
65- logger . debug ( "method={}, args={}" . format ( self . request . method , args ))
59+ logger . debug ( "method={}, path={}" . format ( request . method , request . path ) )
60+
6661 # 是否是资源文件下载(需要对upload进行鉴权处理
67- if HandlerHelper .return_file (self , self .path ):
62+ if HandlerHelper .return_file (self , request .path ):
6863 self ._is_res_request = True
6964 return True
65+
7066 # 收集请求参数
71- params = self .params = HandlerHelper .parse_params (self )
72- logger .debug ("path={}, params={}" .format (self .path , params ))
67+ params = self .params = self .request .params
68+ logger .debug ("path={}, params={}" .format (request .path , params ))
69+
7370 # 寻找控制器
74- controller , controller_action = self .find_controller_action (self , self .path , self . path_arr )
75- controller .__initialize_request__ (self .path , params , self .request )
71+ controller , controller_action = self .find_controller_action (self , self .request )
72+ controller .__initialize_request__ (request .path , params , self .request )
7673
7774 # 执行控制器方法
7875 # hooker.trigger('request_before', controller)
7976 ret = controller_action ()
8077 # hooker.trigger('request_after', controller)
8178
82- return "None" if ret is None else ret
79+ ret = "None" if ret is None else ret
80+ return ret
8381
8482 except ResponseException as e :
8583 return e
@@ -174,8 +172,9 @@ def scan_file_class(cls, file):
174172 return ret
175173
176174 @classmethod
177- def find_controller_action (cls , pro_obj , path , path_arr ):
175+ def find_controller_action (cls , pro_obj , request ):
178176 """找到对应控制器和方法"""
177+ path , path_arr = request .path , request .path_arr
179178 pa = path_arr [1 :] if len (path_arr ) > 0 and path_arr [0 ] == '' else path_arr
180179 if len (pa ) == 0 or pa [0 ] == '' :
181180 pa .extend (["index" , "index" , "index" ])
@@ -224,6 +223,7 @@ def _response_write(self, ret, status_code=200):
224223 logger .exception (e )
225224 ret = ResponseException ("页面异常:{}" .format (str (e )), code = 500 )
226225 return HandlerHelper .return_response (self , ret )
226+
227227 elif isinstance (ret , ResponseFileException ):
228228 return HandlerHelper .return_file (self , ret .file , ret .mime )
229229 elif isinstance (ret , ResponseException ):
@@ -249,5 +249,61 @@ def _response_write(self, ret, status_code=200):
249249
250250 return False
251251
252+ def get_status (self ):
253+ return self .request .status
254+
255+ def set_status (self , status ):
256+ self .response .status = status
257+
258+ def set_header (self , key , val ):
259+ self .response .set_header (key , val )
260+
261+ def write (self , content = None ):
262+ self .response .write (content )
263+
264+ def render (self , template_name , ** kwargs ):
265+ """渲染模板"""
266+ if self ._hdl is not None :
267+ html = self ._hdl .render_string (template_name , ** kwargs )
268+ self .response .write (html )
269+
270+ def finish (self ):
271+ """结束"""
272+ if self ._hdl is not None :
273+ self .response .finish (self ._hdl )
274+
252275 def on_finish (self ):
253276 self ._is_finish = True
277+
278+
279+ class ProcessorHandler (web .RequestHandler ):
280+ """嫁接tornado框架"""
281+
282+ executor = ThreadPoolExecutor (max_workers = Config .web_thr_count (Config .SETTINGS ['pro_thr_num' ]))
283+
284+ def initialize (self ):
285+ request = Request ()
286+ request .__load_from_tornado__ (self .request , self )
287+ self ._hdl = QuickPythonHandler (Application (), request , self )
288+
289+ def data_received (self , chunk : bytes ) -> Optional [Awaitable [None ]]:
290+ pass
291+
292+ @tornado .gen .coroutine
293+ def get (self , * args , ** kwargs ):
294+ self ._hdl .request .method = 'GET'
295+ yield self ._dispose (* args )
296+
297+ @tornado .gen .coroutine
298+ def post (self , * args , ** kwargs ):
299+ self ._hdl .request .method = 'POST'
300+ yield self ._dispose (* args )
301+
302+ @run_on_executor
303+ def _dispose (self , * args ):
304+ pass
305+ logger .info ("处理请求" )
306+ return self ._hdl .__dispose__ ()
307+
308+ def on_finish (self ):
309+ self ._hdl .on_finish ()
0 commit comments