哪个骨架更正确

时间:2016-05-25 05:33:12

标签: python tornado

我将Torndo用于我的项目。我将这个骨架用于服务器。使用此代码,我通过http://server/dev/Foohttp://server/dev/Bar解决了我的方法问题。此代码适用于生产

class MainHandler(SessionBaseHandler):

     def __init__(self, *args, **kwargs):
         global logger
         super(MainHandler, self).__init__(*args, **kwargs)

     @tornado.web.asynchronous
     @tornado.gen.coroutine
     def post(self,func_name):
         request = self.request.body
         func = getattr(self, func_name)
         response = yield tornado.gen.Task(func,request)           
         self.write(response)                
         self.finish()     

     def Foo(self, query, callback):
         callback({"queryFoo":query})        

     def Bar(self, query, callback):
         callback({"queryBar":query})     


class TornadoApplication(tornado.web.Application):

     def __init__(self):
         handlers = [
             (r"/dev/(.*)", acquiring.MainHandler),
         ]
         settings.update(session=session_settings)
         tornado.web.Application.__init__(self, handlers)


http_server = tornado.httpserver.HTTPServer(TornadoApplication())
http_server.listen(Config.get('WebServer','Port'))
tornado.ioloop.IOLoop.instance().start()        

但在文档和文章中有时会像这样描述这个骨架:

class MainHandlerFoo(SessionBaseHandler):

     def __init__(self, *args, **kwargs):
         global logger
         super(MainHandler, self).__init__(*args, **kwargs)    

     @tornado.web.asynchronous
     @tornado.gen.coroutine
     def post(self,func_name):
         request = self.request.body
         response = yield tornado.gen.Task(self._Foo,request)           
         self.write(response)                
         self.finish()     

     def _Foo(self, query, callback):
        callback({"queryFoo":query})                

class MainHandlerBar(SessionBaseHandler):

     def __init__(self, *args, **kwargs):
         global logger
         super(MainHandler, self).__init__(*args, **kwargs)

     @tornado.web.asynchronous
     @tornado.gen.coroutine
     def post(self,func_name):
         request = self.request.body
         response = yield tornado.gen.Task(self._Bar,request)           
         self.write(response)                
         self.finish()     

     def _Bar(self, query, callback):
         callback({"queryBar":query})                

class TornadoApplication(tornado.web.Application):

     def __init__(self):
         handlers = [
             (r"/dev/Foo", acquiring.MainHandlerFoo),
             (r"/dev/Bar", acquiring.MainHandlerBar),
         ]
         settings.update(session=session_settings)
         tornado.web.Application.__init__(self, handlers)


http_server = tornado.httpserver.HTTPServer(TornadoApplication())
http_server.listen(Config.get('WebServer','Port'))
tornado.ioloop.IOLoop.instance().start()        

所以我发现自己不知所措。使用我的骨架时会出现什么问题?我的骨架在文档中描述之前是否存在显着的功能缺陷,或者它只是一种风格问题?

1 个答案:

答案 0 :(得分:1)

第一种方法使用:

getattr(self, func_name)

func_name可以匹配模式.*之后的任何值。这意味着用户可以调用处理程序的任何方法,包括其基类的任何方法。这将导致意想不到的结果,甚至可能成为潜在的安全风险。

用户可以调用以下任何无意中暴露的示例网址:

/dev/__init__
/dev/mro
/dev/put