url_for 在 Jinja2 模板中创建的 FastAPI 链接使用 HTTP 而不是 HTTPS
FastAPI links created by url_for in Jinja2 template use HTTP instead of HTTPS
我将 Waitress 服务的 Flask 中的应用程序迁移到 uvicorn 服务的 FastAPI,但我无法强制链接(由 index.html 模板内的 url_for 生成)使用 HTTPS 而不是HTTP.
我用的女服务员:
from waitress import serve
import flask_app
PORT=5000
HOST_IP_ADDRESS='0.0.0.0'
serve(flask_app.app, host=HOST_IP_ADDRESS, port=PORT, url_scheme="https")
我尝试使用 uvicorn proxy_headers,但没有成功。我在 index.html
中使用了一个解决方法
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
从静态文件正确加载 style.css,但到另一个端点的链接仍然使用 HTTP。
是否有一种简单的方法可以强制 url_for 创建的所有链接都使用 HTTPS?
我之前也 运行 关注过这个问题。一种可能的解决方案是创建一个更改协议的自定义 url_for
函数,然后将其添加到 Jinja 环境中。一种可能的实现可能如下所示:
template = Jinja2Templates("/path/to/templates")
def https_url_for(request: Request, name: str, **path_params: Any) -> str:
http_url = request.url_for(name, **path_params)
# Replace 'http' with 'https'
return http_url.replace("http", "https", 1)
template.env.globals["https_url_for"] = https_url_for
您必须将请求传递给该函数,以便它知道如何生成 url_for
,但是请求应该以任何一种方式传递给您的 Jinja2 模板。
然后您可以像这样在您的 Jinja2 模板中使用它:
https_url_for(request, "/https/path", search="hi")
结果 url 应该类似于 https://<domain>/https/path?search=hi
。
我将 Waitress 服务的 Flask 中的应用程序迁移到 uvicorn 服务的 FastAPI,但我无法强制链接(由 index.html 模板内的 url_for 生成)使用 HTTPS 而不是HTTP.
我用的女服务员:
from waitress import serve
import flask_app
PORT=5000
HOST_IP_ADDRESS='0.0.0.0'
serve(flask_app.app, host=HOST_IP_ADDRESS, port=PORT, url_scheme="https")
我尝试使用 uvicorn proxy_headers,但没有成功。我在 index.html
中使用了一个解决方法<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
从静态文件正确加载 style.css,但到另一个端点的链接仍然使用 HTTP。
是否有一种简单的方法可以强制 url_for 创建的所有链接都使用 HTTPS?
我之前也 运行 关注过这个问题。一种可能的解决方案是创建一个更改协议的自定义 url_for
函数,然后将其添加到 Jinja 环境中。一种可能的实现可能如下所示:
template = Jinja2Templates("/path/to/templates")
def https_url_for(request: Request, name: str, **path_params: Any) -> str:
http_url = request.url_for(name, **path_params)
# Replace 'http' with 'https'
return http_url.replace("http", "https", 1)
template.env.globals["https_url_for"] = https_url_for
您必须将请求传递给该函数,以便它知道如何生成 url_for
,但是请求应该以任何一种方式传递给您的 Jinja2 模板。
然后您可以像这样在您的 Jinja2 模板中使用它:
https_url_for(request, "/https/path", search="hi")
结果 url 应该类似于 https://<domain>/https/path?search=hi
。