Wymored Login

Como redirecionar http para https no python tornado

10 de janeiro de 2019 por Alexandre Miguel de Andrade Souza

Quando usamos ssl em um site, é natural querer redirecionar todo o tráfefo para a porta segura.

No tornado podemos fazer isso com os seguintes passos

1) configurar o tornado para ouvir as portas 80 e 443:

async def main():
    #pode haver código adicional aqui

    app = Application(db)
    app.listen(80)
    import os
    p = os.path.dirname(os.path.abspath(__file__))
    http_server = tornado.httpserver.HTTPServer(app, ssl_options={
        #you need to auto-generate or put the files or simlinks to cert files below
        "certfile": os.path.join(p,"fullchain.pem"),
        "keyfile": os.path.join(p,"privkey.pem")
    })

    http_server.listen(443)

    # In this demo the server will simply run until interrupted
    # with Ctrl-C, but if you want to shut down more gracefully,
    # call shutdown_event.set().
    shutdown_event = tornado.locks.Event()
    await shutdown_event.wait()

if __name__ == "__main__":

    print('ouvindo em https://localhost')
    tornado.ioloop.IOLoop.current().run_sync(main)

No código acima, o truque está na linha app.listen(80), na configuração do ssl e então ouvir http_server.listen(443) e por fim, na forma de iniciar o servidor tornado.ioloop.IOLoop.current().run_sync(main)

A outra parte do truque está em criar uma classe para servir de base para os controllers (handlers) e criar uma função prepare, que executada antes da execução da classe:

class BaseHandler(tornado.web.RequestHandler):
    async def prepare(self):
        if self.request.protocol == 'http':
            print(self.request)
            r = str(self.request.host).split(':')
            h = r[0]

            url = 'https://' + h + self.request.uri
            print(url)
            self.redirect(url, permanent=False)
            #self.redirect('https://' + self.request.host, permanent=False)
            #     
        elif self.request.protocol == 'https':
           pass # ou inclua código adicional

Por fim, não esqueça de basear seus controllers/handlers na classe acima, como em:

class HomeHandler(BaseHandler):
    #resto do código

Inté!