我将Torndo用于我的项目。我将这个骨架用于服务器。使用此代码,我通过http://server/dev/Foo和http://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()
所以我发现自己不知所措。使用我的骨架时会出现什么问题?我的骨架在文档中描述之前是否存在显着的功能缺陷,或者它只是一种风格问题?
答案 0 :(得分:1)
第一种方法使用:
getattr(self, func_name)
func_name
可以匹配模式.*
之后的任何值。这意味着用户可以调用处理程序的任何方法,包括其基类的任何方法。这将导致意想不到的结果,甚至可能成为潜在的安全风险。
用户可以调用以下任何无意中暴露的示例网址:
/dev/__init__
/dev/mro
/dev/put