2016-05-25 1 views
0

私はプロジェクトに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

第一の方法は、使用:

getattr(self, func_name) 

func_nameパターン.*以下の任意の値を一致させることができる場合。これは、ユーザがハンドラのメソッドを呼び出すことができることを意味します。これにより予期せぬ結果が発生し、潜在的なセキュリティリスクになる可能性があります。

ユーザが意図せずに露出されている次の例のURLのいずれかを呼び出すことができ:

/dev/__init__ 
/dev/mro 
/dev/put 
関連する問題