你的flask服务开启https了吗?
一、你的flask服务开启https了吗?
1.事件起因
计划做文心一言插件,我购买了服务器,开始按照我的想象部署插件,结果工作不错,但是最后一步图片显示不正常。哭晕了,如下图所示。
仔细阅读,发现返回图片地址什么的都很正常啊,也可以访问得到,但是为什么就不能看到呢,很奇怪。
经多方排查,最终确定是图片跨域导致无法显示。
2.解决思路
知道是跨域问题就好了,因为文心一言是https访问,所以提供服务的也需要https,那么就开始作了(解决)。
二、解决办法
1.无效1.0解决办法
知道要https那我就加https了,直接百度解决办法。
- Flask(更具体地说其实是Werkzeug),支持使用即时证书,这对于通过HTTPS快速提供应用程序非常有用,而且不会搞乱系统的证书。你只有需要做的就是将
ssl_context ='adhoc'
添加到程序的app.run()
调用中。遗憾的是,Flask CLI无法使用此选项。举个例子,下面是官方文档中的“Hello,World” Flask应用程序,并添加了TLS加密: - 安装库 pip install pyopenssl
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run(ssl_context='adhoc')
这样启动起来就是https了,但是访问问题依旧,图片仍然没有显示。。。。。。仔细看来浏览器说是假的ssl,那就继续解决。
2.无效2.0自签名证书解决办法
所谓的自签名证书是使用与同一证书关联的私钥生成签名的证书,就是自己动手丰衣足食。
- 生成证书
- flask加载证书
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run(ssl_context=('cert.pem', 'key.pem'))
复制代码
然后看结果,依然无效,因为是自签名。。。。。。
3.0终极解决办法
后来发现要真正的证书,那么你必须要有域名,才会发给你,就是说证书和域名是绑定的,就跟户籍一样,户籍都没有说什么学区房,没人理你。
- 为此我花了8块买了一个cn一年的域名,并且进行了实名。
- 在腾讯云申请ssl证书,参考地址 cloud.tencent.com/document/pr…
- 申请地址 console.cloud.tencent.com/ssl
申请时必须先证明该证书属于你,需要按提示加入cname,进行验证。申请完毕略等一会就会通过,下载证书即可,具体包含以下几个问题件:
- 加载证书
因为有4个文件,没有详细写,因此我测试了几次,最终成功。
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', ssl_context=( 'erniebotplugins.cn_bundle.crt','erniebotplugins.cn.key'), port=8081)
三、最终效果
用上最终大招后,最终成功,具体效果如下。
可见现在ssl非常普遍,不安全别的网站都懒得搭理你。
作者:Livingbody
来源:juejin.cn/post/7305235970285568011
来源:juejin.cn/post/7305235970285568011