uvicorn [fastapi] python работает как по протоколу HTTP, так и по протоколу HTTPS

#python-3.x #ssl #fastapi #uvicorn #https-redirect

Вопрос:

Я пытаюсь запустить приложение fastapi с SSL.

Я запускаю приложение с помощью uvicorn.

Я могу запустить сервер на порту 80 с помощью HTTP,

 if __name__ == '__main__':
    uvicorn.run("main:app", port=80, host='0.0.0.0', reload = True, reload_dirs = ["html_files"])
 

Чтобы запустить порт с HTTPS, я делаю следующее,

 if __name__ == '__main__':
    uvicorn.run("main:app", port=443, host='0.0.0.0', reload = True, reload_dirs = ["html_files"], ssl_keyfile="/etc/letsencrypt/live/my_domain/privkey.pem", ssl_certfile="/etc/letsencrypt/live/my_domain/fullchain.pem")
 

Как я могу запустить оба или просто интегрировать перенаправление https?

N. B: Это настройка на сервере, где я не хочу использовать nginx, я знаю, как использовать nginx для реализации перенаправления https.

Ответ №1:

Запустите подпроцесс, чтобы вернуть ответ на перенаправление с одного порта на другой.

main.py:

 if __name__ == '__main__':
    Popen(['python', '-m', 'https_redirect'])  # Add this
    uvicorn.run(
        'main:app', port=443, host='0.0.0.0',
        reload=True, reload_dirs=['html_files'],
        ssl_keyfile='/etc/letsencrypt/live/my_domain/privkey.pem',
        ssl_certfile='/etc/letsencrypt/live/my_domain/fullchain.pem')
 

https_redirect.py:

 import uvicorn
from fastapi import FastAPI
from starlette.requests import Request
from starlette.responses import RedirectResponse

app = FastAPI()


@app.route('/{_:path}')
async def https_redirect(request: Request):
    return RedirectResponse(request.url.replace(scheme='https'))

if __name__ == '__main__':
    uvicorn.run('https_redirect:app', port=80, host='0.0.0.0')