Python Flask Jinja2中如何让url_for生成带HTTPS的JS文件引用链接
解决Flask Jinja2中url_for生成HTTPS静态资源链接的问题
静态资源加载失败的核心原因是Flask无法识别反向代理转发的原始HTTPS请求协议,默认生成了HTTP协议的静态资源链接,触发浏览器的混合内容拦截规则。
推荐生产环境解决方案:配置ProxyFix中间件
绝大多数Flask生产部署会使用Nginx等反向代理做HTTPS终结,反向代理将HTTPS请求转成HTTP发送给后端Flask服务,同时通过X-Forwarded-Proto请求头传递原始请求的协议。Flask默认不会读取该请求头,因此默认按HTTP协议生成链接。
在Flask应用初始化代码中添加如下配置即可:
from flask import Flask from werkzeug.middleware.proxy_fix import ProxyFix app = Flask(__name__) # 信任1层反向代理传递的协议、主机头,根据实际代理层数调整x_proto、x_host参数值 app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)
配置完成后,原有Jinja2模板中的url_for无需额外修改,会自动根据原始请求的协议生成对应HTTPS路径。
临时调试方案:手动指定url_for协议参数
如果不需要全局配置,可单独给每个url_for传参强制指定HTTPS协议,修改原有模板代码如下:
<script src="{{ url_for('static', filename='js/typed.min.js', _external=True, _scheme='https') }}"></script> <script src="{{ url_for('static', filename='vendor/jquery/jquery.min.js', _external=True, _scheme='https') }}"></script> <script src="{{ url_for('static', filename='vendor/bootstrap/js/bootstrap.bundle.min.js', _external=True, _scheme='https') }}"></script> <script src="{{ url_for('static', filename='vendor/owl.carousel2/owl.carousel.min.js', _external=True, _scheme='https') }}"></script> <script src="{{ url_for('static', filename='vendor/modal-video/js/modal-video.min.js', _external=True, _scheme='https') }}"></script>
注意:原有模板中
filename参数开头的斜杠为冗余写法,Flask的静态文件路由会自动拼接/static/前缀,带开头斜杠可能生成冗余双斜杠路径,建议统一去掉。
该写法会强制生成绝对路径的HTTPS链接,本地开发如果使用HTTP协议访问会出现资源加载失败,不适合长期全局使用。
全局默认协议配置
如果需要全局默认生成HTTPS链接,可在Flask配置中添加参数:
app.config['PREFERRED_URL_SCHEME'] = 'https'
该配置仅在url_for传入_external=True参数时生效,默认生成的相对路径会自动继承当前页面的协议,本身不会出现HTTP/HTTPS不匹配的问题。

内容的提问来源于stack exchange,提问作者JhowBhz
相关产品推荐
相关产品推荐

