uvicorn [fastapi] python 运行 HTTP 和 HTTPS

问题描述 投票:0回答:3

我正在尝试使用 SSL 运行 fastapi 应用程序。

我正在使用 uvicorn 运行该应用程序。

我可以使用 HTTP 在端口 80 上运行服务器,

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 重定向。

python-3.x ssl fastapi uvicorn http-redirect
3个回答
11
投票

运行子进程以将重定向响应从一个端口返回到另一个端口。

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='/path/to/certificate-key.pem',
        ssl_certfile='/path/to/certificate.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')

10
投票

您可以使用

HTTPSRedirectMiddleware
。这将强制“所有传入请求必须是
https
wss
。任何对
http
ws
的传入请求都将被重定向到安全方案。

from fastapi import FastAPI
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware

app = FastAPI()
app.add_middleware(HTTPSRedirectMiddleware)


@app.get("/")
async def main():
    return {"message": "Hello World"}

0
投票

我认为您可以使用以下命令将操作系统级别上的所有流量从端口 80 重定向到端口 443。 例如,在 Ubuntu 上,通过在终端中运行:

sudo iptables -t nat -L
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 443 # 80 -> 443
© www.soinside.com 2019 - 2024. All rights reserved.