Как передать переменную среды (база данных URL) в торнадо? - PullRequest
0 голосов
/ 11 июля 2019

У меня есть эластичный URL, который нужно передать как переменную окружения в метод post, я объявил make_session_factory из tornado_sqlalchemy и передал requesthandler, как мне получить это в себе, ниже мой код

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()

На данный момент я закодировал URL в моей функции мода как localhost, 9200,

Чтобы передать это как переменную окружения, я создал фабрику и передал фабрику как session_factory в моем приложении,

Я должен получить это в моем методе post для обработчика запросов, чтобы я мог перейти к моему методу прогнозирования, который в свою очередь вызывает мою функцию мод, могу ли я знать, как ее получить.Я попытался с инициализацией, но не работает должным образом.

Также нашел другой вариант, используя мотор с торнадо

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']

Здесь также я должен получить в моем сообщении метод

1 Ответ

1 голос
/ 11 июля 2019

Любые дополнительные аргументы, передаваемые в класс Application, будут доступны в 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
...