在JJIA2模板中由url_for创建的FastAPI链接使用HTTP而不是HTTPS [英] FastAPI links created by url_for in Jinja2 template use HTTP instead of HTTPS

查看:0
本文介绍了在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆