我有一个基本的FastAPI网站,它有一个下载Excel模板的端点。网址的方案是HTTPS
。直到最近,这个方案在Chrome和Safari上都运行得很好。随着人们的升级,Chrome一直在阻止下载。这似乎与谷歌针对“混合内容下载”实施的不安全内容政策一致,如本文所述:
https://blog.chromium.org/2020/02/protecting-users-from-insecure.html
我的终结点非常简单:
@router.get('/download_data_template')
def download_data_template(request: Request):
'''Returns data template from library
'''
# ### auth
# page access is authorized here
# end auth
file_name = 'TEMPLATE schedule_input.xlsx'
return FileResponse(
path=db.get_library_path(file_name),
filename=file_name,
media_type='application/octet-stream',
)
使用以下代码从Jinja2模板化的html页面调用终结点:
<a class="btn btn-primary" href="{{ url_for('upload_schedule')}}" data-toggle="tooltip" data-delay='{"show":750, "hide":250}' data-placement="top" data-toggle="tooltip" data-delay='{"show":750, "hide":250}' data-placement="top" title="click to select and upload file. The file must be in property format.">upload schedule input workbook</a>
在Chrome上,开发者面板显示以下错误:
"Mixed Content: The site at 'https://<my_url>.com/' was loaded over a secure connection, but the file at 'https://<my_url>.com/download_data_template' was redirected through an insecure connection. This file should be served over HTTPS. This download has been blocked. See https://blog.chromium.org/2020/02/protecting-users-from-insecure.html for more details."
这个文件没有什么独特之处,它是一个基本的Excel .xlsx文件,一个供人们填写的模板。
这在Safari和Edge中继续正常工作,但被Chrome阻止。
chromium博客中的文章信息量很大,但我不知道如何使我的下载安全。我也搜索过,但没有成功。
有什么想法,我可以使一个基本的文件下载,特别是一个.xlsx文件,从光盘使用FastAPI,将符合谷歌的新政策?
谢谢你的帮助。
2条答案
按热度按时间zdwk9cvp1#
选项1
您可以使用
HTTPSRedirectMiddleware
强制将所有传入的http
请求重定向到安全方案。选项2
除了上面提到的,你可以在Jinja 2模板中使用相对URL而不是使用
url_for()
;例如:这样,URL的方案将保持
https
。选项3
您可以使用自己的
url_for
自定义函数来替换URL的方案,类似于this answer的Option 2中演示的方法。您可能还想尝试将
--proxy-headers
参数传递给Uvicorn,如下所述。lh80um4z2#
我正在FastAPI后端开发React应用程序,也遇到了类似的问题。我不确定
{{ url_for('upload_schedule')}}
在渲染引擎中的评估结果,但在我的案例中,问题是不准确的URL及其FastAPI的处理。参考您的示例,我在UI代码中放置了
/download_data_template/
,因此FastAPI引擎发送了307
,因为它重定向到/download_data_template
。在UI代码中将/download_data_template/
替换为/download_data_template
解决了这个问题。这可能是Chrome的问题,而不是FastAPI,但这是一个简单的解决办法,立即修复。