【问题标题】:Flask / Gcloud error "content must be served over HTTPS"Flask / Gcloud 错误“内容必须通过 HTTPS 提供”
【发布时间】:2021-03-05 04:19:53
【问题描述】:

我有一个在 Gcloud 上运行的 Flask 应用程序,它使用 html 网页将图像发送到 Python 脚本以进行预测(从根目录中保存的模型绘制)。

当我发送预测时,我收到错误“内容必须通过 HTTPS 提供”。

如何将烧瓶配置为独占使用 HTTPS?我的 html 已经在使用:

    $.post("https://0.0.0.0:5000/predict", JSON.stringify(message), function(response){

我是否也需要在 Python 中进行一些更改?

【问题讨论】:

    标签: python flask gcloud


    【解决方案1】:

    您必须提供 SSL 证书才能使用 HTTPs 运行 Flask 应用程序

    from flask import Flask
    from OpenSSL import SSL
    
    context = SSL.Context(SSL.PROTOCOL_TLSv1_2)
    context.use_privatekey_file('server.key')
    context.use_certificate_file('server.crt')   
    
    app = Flask(__name__)
    
    if __name__ == '__main__':  
         app.run(host='0.0.0.0',port=5000, ssl_context=context)
    

    【讨论】:

    • 谢谢,但这似乎不能解决问题 - 完整的错误是:“jquery-3.3.1.min.js:2 Mixed Content: The page at 'architectural-style-classifier.uc.r.appspot.com/predict' was loaded通过 HTTPS,但请求了不安全的 XMLHttpRequest 端点“0.0.0.0:5000/predict”。此请求已被阻止;内容必须通过 HTTPS 提供。“问题来自 html 还是 python?
    • 如果你现在没有在python端配置SSL,那么你需要用HTTP而不是HTTPS调用API。
    • 我是否必须使用灵活的运行时环境才能使其工作?
    【解决方案2】:

    简单来说,您的网站是通过 HTTPS 提供服务的,但在您的应用程序代码(您的 html 页面、原始代码等)中,您可以引用使用 HTTP 的链接。您必须确保嵌入您网站或被调用的每个链接都使用 HTTPS。这包括图像链接、javascript 文件(如 JQUERY 文件的链接)、CSS 文件等。

    例子

    a) 您以 http://code.jquery.com/jquery-3.3.1.min.js. 链接到 jquery CDNS 您必须将其更改为 - https://code.jquery.com/jquery-3.3.1.min.js

    此外,您可能会收到此错误,因为您已将网站设置为始终使用 HTTPS(我看到您使用的是 Google App Engine;您很可能将 app.yaml 设置为始终使用“安全”路由)。另一种选择(不是很可取,因为使用 https 总是好的)是始终在您的 app.yaml 文件中关闭“安全”。

    【讨论】:

    • 再次查看您的帖子,在我看来您正在从生产服务器调用您的开发服务器 (0.0.0.:5000)。在本地服务器上配置 https 通常非常困难,因此如果您必须进行此类调用,请考虑使用“ngrok.io”,这将允许您获得路由到本地服务器的“https”连接
    • 好的,我也可以更改它调用的 IP 吗?例如$.post("https://127.0.0.1:8080/predict/", JSON.stringify(message), function(response){(在 html 中)和 if __name__ == '__main__': app.run(host='127.0.0.1',port=8080, ssl_context=context) (在 python 中)我最初也没有在我的 yaml 文件中使用灵活的环境,不确定这是否是我必须使用的东西 - 当我使用灵活时它变得很多慢得多(这个脚本使用 tensorflow,所以可能是相关的)
    • 除非您在本地服务器上配置了“https”,否则您无法使用https://127.0.0.1。而是安装ngrok.io,它会给你类似https://123456789.ngrok.io:8080/predict/ 的东西,它已经映射到你的开发服务器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 2018-12-18
    • 1970-01-01
    • 2015-03-23
    • 2016-08-28
    • 2023-01-30
    • 1970-01-01
    相关资源
    最近更新 更多