在JJIA2模板中由url_for创建的FastAPI链接使用HTTP而不是HTTPS [英] FastAPI links created by url_for in Jinja2 template use HTTP instead of HTTPS
本文介绍了在JJIA2模板中由url_for创建的FastAPI链接使用HTTP而不是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_Header,但不起作用。我在index.html中使用了一个解决方法
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
正确地从静态文件加载了style.css,但指向另一个终结点的链接仍使用HTTP。
是否有一种简单的方法可以强制url_for创建的所有链接使用HTTPS?
推荐答案
我以前也遇到过这个问题。一种可能的解决方案是创建一个定制的url_for
函数来更改协议,然后将其添加到JJJA环境中。一种可能的实现可能如下所示:
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
,但是请求应该以任何一种方式传递给您的JJANA2模板。
然后您可以像这样在您的JJIA2模板中使用它:
https_url_for(request, "/https/path", search="hi")
生成的URL应类似https://<domain>/https/path?search=hi
。
这篇关于在JJIA2模板中由url_for创建的FastAPI链接使用HTTP而不是HTTPS的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文