之前做比赛的时候,微信小程序要求只有https协议的网页服务才能访问,但是比赛期间没有时间升级https,只能硬着头皮用servlet做后端进行数据交互。现在闲下来了,回头填一下比赛留下的坑。
本篇文章主要记录了Flask如何配置ssl证书,使用https协议进行网页搭建。
前言
之前不是走网页方向的,所以对这些了解不是很了解。但是做比赛的时候我做了一部分的服务器开发,所以慢慢就对这个方向有些感兴趣了。
做比赛的时候问过学长https配置的事情,学长让我配置tomcat的ssl证书,但是tomcat是Javaweb的容器,而Flask是Pythonweb的容器,所以要想让Flask搭建的服务运行在https协议上,还是要让SSL证书配置到Flask中。
下面开始讲解具体怎么配置:
申请SSL证书
我租的服务器用的是阿里云,所以后来从域名到ssl证书申请都是在阿里云一家买的。ssl证书有免费的,可以直接在阿里云中搜索“SSL证书”:
然后就可以购买免费的SSL证书了:
购买之后,要等证书签发下来才可以使用,等证书签发成功,把证书下载下来(右边有个下载按钮):
下载尽量选择***.key
与***.pem
格式的证书。tomcat的证书格式就不是这个格式,我下载选择的是其他。
这样就把所需要的SSL证书下载下来了,将两个证书上传到服务器上。
在Flask进行配置
这一步倒是蛮简单的,直接看代码吧:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return "这是首页"
if __name__=="__main__":
app.run('0.0.0.0', debug=True, port=11000, ssl_context=('path/xxxx.pem', 'path/xxxx.key'))
记得在服务器设置的防火墙中打开11000端口。
打开网页:
很成功!你也可以尝试将11000端口换成443端口,这样就可以直接通过域名进行访问了,不需要再加上后面的端口号。
Flask使用子域名
给子域名添加DNS解析
在不同云平台都可以直接设置域名解析,以阿里云为例:
代码
from flask import Flask,Blueprint
# 这里需要对蓝图进行template和static文件夹的配置,不然访问子域名会找不到静态文件夹,返回404
api=Blueprint('api',__name__,subdomain='api',template_folder='templates',static_folder='static')
#这里改成api.route('/')而不是app.route('/')
@api.route('/login')
def index():
return "这是api的首页"
if __name__=="__main__":
app=Flask(__name__)
app.register_blueprint(api,subdomain='api')
app.config.update({'SERVER_NAME':'lhystrive.com:11000'})
app.run('0.0.0.0', debug=True, port=11000)
通过添加的几行代码,实现路由转发的功能,这样就能通过http://api.lhystrive.com:11000
来访问网站了。同样,在app.run()中加入你的ssl_content(注意,这里使用你的子域名生成的证书才可以,不能用原来域名的证书,你需要再去ssl证书生成界面生成你的子域名ssl证书),就可以通过https协议和你的子域名访问网站了。
后记:不知道为什么,使用https+子域名的时候不能监听使用443端口,使用http+子域名的时候不能监听使用80端口,这个bug只有在使用子域名中会出现,很迷,不过换成其他端口都可以正常访问(前提是其他端口的防火墙记得打开),比如说10000、11000等等。