如何在 Tornado 中传递环境变量(数据库URL)?
How to pass environmental variable (database URL) in Tornado?
我有弹性 URL 作为环境变量传递给 post 方法,我已经从 tornado_sqlalchemy 声明了 make_session_factory,并传递给请求处理程序,我应该如何自己接收,下面是我的代码
class MyHandler(RequestHandler):
_thread_pool = ThreadPoolExecutor(max_workers=10)
def initialize(self, session_factory):
self.session_factory = session_factory
@gen.coroutine
def post(self):
try:
data = tornado.escape.json_decode(self.request.body)
yield self.predict('mod1')
except Exception:
self.respond('server_error', 500)
@concurrent.run_on_executor(executor='_thread_pool')
def _b_run(self, mod, X):
results = do some calculation
return results
@gen.coroutine
def predict(self, mod):
model = mod(load from database)
values = (load from database)
results = yield self._b_run(model, values)
self.respond(results)
def respond(self, code=200):
self.set_status(code)
self.write(json.JSONEncoder().encode({
"status": code
}))
self.finish()
def mod(model):
#Elastic Client
es = Elasticsearch([{'host': 'localhost', 'port': 9200}])
……...Load model
return model
factory = make_session_factory(os.environ.get('DATABASE_URL', ''))
define('port', default=8888, help='Tornado port to listen on')
def make_app():
url = [(r"/pred", PredictionHandler)]
return Application(url,session_factory=factory)
if __name__ == "__main__":
application = make_app()
http_server = HTTPServer(application)
http_server.listen(options.port)
IOLoop.current().start()
目前,我已将 mod 函数中的 URL 编码为本地主机,9200,
为了将其作为环境变量传递,我创建了工厂并在我的应用程序中将工厂作为 session_factory 传递,
我必须在我的请求处理程序 post 方法中接收它,以便我可以传递给我的预测方法,该方法随后调用我的 mod 函数,我可以知道如何接收它吗?我尝试初始化但无法正常工作。
还找到了另一个使用龙卷风电机的选项
import motor.motor_tornado
client = motor.motor_tornado.MotorClient('localhost', 9200)
db = motor.motor_tornado.MotorClient().test_database
application = tornado.web.Application([
(r'/', MainHandler)
], db=db)
class MainHandler(tornado.web.RequestHandler):
def get(self):
db = self.settings['db']
这里我也必须在我的 post 方法中接收
您传递给 Application
class 的任何额外参数都将在 self.settings
中从您的任何请求处理程序中可用。
所以你可以这样修改initialize
方法:
def initialize(self):
self.session_factory = self.settings['session_factory']
# and just use `self.session_factory` in any other method where you need it
我有弹性 URL 作为环境变量传递给 post 方法,我已经从 tornado_sqlalchemy 声明了 make_session_factory,并传递给请求处理程序,我应该如何自己接收,下面是我的代码
class MyHandler(RequestHandler):
_thread_pool = ThreadPoolExecutor(max_workers=10)
def initialize(self, session_factory):
self.session_factory = session_factory
@gen.coroutine
def post(self):
try:
data = tornado.escape.json_decode(self.request.body)
yield self.predict('mod1')
except Exception:
self.respond('server_error', 500)
@concurrent.run_on_executor(executor='_thread_pool')
def _b_run(self, mod, X):
results = do some calculation
return results
@gen.coroutine
def predict(self, mod):
model = mod(load from database)
values = (load from database)
results = yield self._b_run(model, values)
self.respond(results)
def respond(self, code=200):
self.set_status(code)
self.write(json.JSONEncoder().encode({
"status": code
}))
self.finish()
def mod(model):
#Elastic Client
es = Elasticsearch([{'host': 'localhost', 'port': 9200}])
……...Load model
return model
factory = make_session_factory(os.environ.get('DATABASE_URL', ''))
define('port', default=8888, help='Tornado port to listen on')
def make_app():
url = [(r"/pred", PredictionHandler)]
return Application(url,session_factory=factory)
if __name__ == "__main__":
application = make_app()
http_server = HTTPServer(application)
http_server.listen(options.port)
IOLoop.current().start()
目前,我已将 mod 函数中的 URL 编码为本地主机,9200,
为了将其作为环境变量传递,我创建了工厂并在我的应用程序中将工厂作为 session_factory 传递,
我必须在我的请求处理程序 post 方法中接收它,以便我可以传递给我的预测方法,该方法随后调用我的 mod 函数,我可以知道如何接收它吗?我尝试初始化但无法正常工作。
还找到了另一个使用龙卷风电机的选项
import motor.motor_tornado
client = motor.motor_tornado.MotorClient('localhost', 9200)
db = motor.motor_tornado.MotorClient().test_database
application = tornado.web.Application([
(r'/', MainHandler)
], db=db)
class MainHandler(tornado.web.RequestHandler):
def get(self):
db = self.settings['db']
这里我也必须在我的 post 方法中接收
您传递给 Application
class 的任何额外参数都将在 self.settings
中从您的任何请求处理程序中可用。
所以你可以这样修改initialize
方法:
def initialize(self):
self.session_factory = self.settings['session_factory']
# and just use `self.session_factory` in any other method where you need it