能否将HTTPS功能添加到python flask web服务器?
我正在尝试构建一个web界面来模拟网络设备上的restful界面。这个网络设备使用摘要身份验证和HTTPS。 我知道如何将摘要身份验证集成到web服务器中,但如果您能告诉我如何使用FLASK获得https,我似乎无法找到如何使用FLASK获得https。请评论我需要如何使用下面的代码来实现这一点能否将HTTPS功能添加到python flask web服务器?,python,rest,https,flask,Python,Rest,Https,Flask,我正在尝试构建一个web界面来模拟网络设备上的restful界面。这个网络设备使用摘要身份验证和HTTPS。 我知道如何将摘要身份验证集成到web服务器中,但如果您能告诉我如何使用FLASK获得https,我似乎无法找到如何使用FLASK获得https。请评论我需要如何使用下面的代码来实现这一点 from flask import Flask, jsonify app = Flask(__name__) @app.route('/') def index(): return 'Fl
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/')
def index():
return 'Flask is running!'
@app.route('/data')
def names():
data = {"names": ["John", "Jacob", "Julie", "Jennifer"]}
return jsonify(data)
if __name__ == '__main__':
app.run()
在真正的web服务器上部署Flask,而不是使用内置(开发)服务器 请参阅烧瓶文档的第页。Nginx和Apache等服务器都可以为站点设置HTTPS服务器,而不是HTTP服务器
列出的独立WSGI服务器通常部署在Nginx和Apache后面的代理转发配置中,其中前端服务器仍然为您处理SSL加密。将Flask部署在真正的web服务器上,而不是使用内置(开发)服务器 请参阅烧瓶文档的第页。Nginx和Apache等服务器都可以为站点设置HTTPS服务器,而不是HTTP服务器
列出的独立WSGI服务器通常部署在Nginx和Apache后面的代理转发配置中,其中前端服务器仍然为您处理SSL加密。这也适用于紧急情况
from flask import Flask, jsonify
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__)
@app.route('/')
def index():
return 'Flask is running!'
@app.route('/data')
def names():
data = {"names": ["John", "Jacob", "Julie", "Jennifer"]}
return jsonify(data)
#if __name__ == '__main__':
# app.run()
if __name__ == '__main__':
app.run(host='127.0.0.1', debug=True, ssl_context=context)
这在紧要关头也起作用
from flask import Flask, jsonify
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__)
@app.route('/')
def index():
return 'Flask is running!'
@app.route('/data')
def names():
data = {"names": ["John", "Jacob", "Julie", "Jennifer"]}
return jsonify(data)
#if __name__ == '__main__':
# app.run()
if __name__ == '__main__':
app.run(host='127.0.0.1', debug=True, ssl_context=context)
不要使用openssl或pyopenssl它现在在python中变成了障碍
请参阅下面的代码
from flask import Flask, jsonify
import os
ASSETS_DIR = os.path.dirname(os.path.abspath(__file__))
app = Flask(__name__)
@app.route('/')
def index():
return 'Flask is running!'
@app.route('/data')
def names():
data = {"names": ["John", "Jacob", "Julie", "Jennifer"]}
return jsonify(data)
if __name__ == '__main__':
context = ('local.crt', 'local.key')#certificate and key files
app.run(debug=True, ssl_context=context)
不要使用openssl或pyopenssl它现在在python中变成了障碍
请参阅下面的代码
from flask import Flask, jsonify
import os
ASSETS_DIR = os.path.dirname(os.path.abspath(__file__))
app = Flask(__name__)
@app.route('/')
def index():
return 'Flask is running!'
@app.route('/data')
def names():
data = {"names": ["John", "Jacob", "Julie", "Jennifer"]}
return jsonify(data)
if __name__ == '__main__':
context = ('local.crt', 'local.key')#certificate and key files
app.run(debug=True, ssl_context=context)
如果此Web服务器仅用于测试和演示目的。您可以使用ngrok,它也是一个开源软件,可以为您的http流量提供隧道 Bascially ngrok创建一个公共URL(http和https),然后将流量隧道到Flask进程运行的任何端口 设置只需几分钟。你首先要下载软件。然后运行命令
./ngrok http[运行python进程的端口号]
然后,它将在终端中打开一个窗口,为您提供一个http和https url来访问您的web应用程序 如果此Web服务器仅用于测试和演示目的。您可以使用ngrok,它也是一个开源软件,可以为您的http流量提供隧道 Bascially ngrok创建一个公共URL(http和https),然后将流量隧道到Flask进程运行的任何端口 设置只需几分钟。你首先要下载软件。然后运行命令
./ngrok http[运行python进程的端口号] 然后,它将在终端中打开一个窗口,为您提供一个http和https url来访问您的web应用程序
- 要在flask应用程序中运行https功能或SSL身份验证,请首先使用以下方法安装“pyOpenSSL”python包:
pip install pyopenssl
- 下一步是在终端上使用以下命令创建“cert.pem”和“key.pem”:
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
- 在您的flask应用程序项目中复制生成的“cert.pem”和“kem.pem”
- 在app.run()中添加ssl_上下文=('cert.pem','key.pem')
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/')
def index():
return 'Flask is running!'
@app.route('/data')
def names():
data = {"names": ["John", "Jacob", "Julie", "Jennifer"]}
return jsonify(data)
if __name__ == '__main__':
app.run(ssl_context=('cert.pem', 'key.pem'))
- 要在flask应用程序中运行https功能或SSL身份验证,请首先使用以下方法安装“pyOpenSSL”python包:
pip install pyopenssl
- 下一步是在终端上使用以下命令创建“cert.pem”和“key.pem”:
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
- 在您的flask应用程序项目中复制生成的“cert.pem”和“kem.pem”
- 在app.run()中添加ssl_上下文=('cert.pem','key.pem')
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/')
def index():
return 'Flask is running!'
@app.route('/data')
def names():
data = {"names": ["John", "Jacob", "Julie", "Jennifer"]}
return jsonify(data)
if __name__ == '__main__':
app.run(ssl_context=('cert.pem', 'key.pem'))
对于快速自签名证书,您还可以使用
flask run--cert adhoc
或设置flask\u run\u cert
env var
$ export FLASK_APP="app.py"
$ export FLASK_ENV=development
$ export FLASK_RUN_CERT=adhoc
$ flask run
* Serving Flask app "app.py" (lazy loading)
* Environment: development
* Debug mode: on
* Running on https://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 329-665-000
adhoc
选项没有很好的文档记录(出于很好的理由,在生产过程中永远不要这样做),但是在中提到了它
at对此有详细的解释。对于快速、肮脏的自签名证书,您也可以使用
flask run--cert adhoc
或设置flask\u run\u cert
env var
$ export FLASK_APP="app.py"
$ export FLASK_ENV=development
$ export FLASK_RUN_CERT=adhoc
$ flask run
* Serving Flask app "app.py" (lazy loading)
* Environment: development
* Debug mode: on
* Running on https://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 329-665-000
adhoc
选项没有很好的文档记录(出于很好的理由,在生产过程中永远不要这样做),但是在中提到了它
at对此有一个透彻的解释。的想法是正确的,但API似乎已经进化到不再像2015年首次编写时那样工作
取而代之的是:
from OpenSSL import SSL
context = SSL.Context(SSL.PROTOCOL_TLSv1_2)
context.use_privatekey_file('server.key')
context.use_certificate_file('server.crt')
我在Python 3.7.5中使用了这个:
import ssl
context = ssl.SSLContext()
context.load_cert_chain('fullchain.pem', 'privkey.pem')
然后在Flask中提供SSL上下文。按其所述运行调用:
app.run(…, ssl_context=context)
(我的server.crt
文件名为fullchain.pem
,我的server.key
名为privkey.pem
。这些文件是由我的LetsEncrypt Certbot提供给我的。)有正确的想法,但API似乎已经进化到不再像2015年首次编写时那样工作
取而代之的是:
from OpenSSL import SSL
context = SSL.Context(SSL.PROTOCOL_TLSv1_2)
context.use_privatekey_file('server.key')
context.use_certificate_file('server.crt')
我在Python 3.7.5中使用了这个:
import ssl
context = ssl.SSLContext()
context.load_cert_chain('fullchain.pem', 'privkey.pem')
然后在Flask中提供SSL上下文。按其所述运行调用:
app.run(…, ssl_context=context)
(我的server.crt
文件名为fullchain.pem
,我的server.key
名为privkey.pem
。这些文件由我的LetsEncrypt Certbot提供给我。)超级简单:
app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
跑步:
$ openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
$ flask run --cert=cert.pem --key=key.pem
超级简单:
app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
跑步:
$ openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
$ flask run --cert=cert.pem --key=key.pem
如果您使用mod_wsgi-express(),它提供了一种使用HTTPS运行站点的简单方法,并且还具有在web服务器级别处理摘要身份验证协议的内置功能。建议您在mod_wsgi邮件列表中询问,因为StackOverflow不是一个讨论论坛,因此此处不太容易解释。@Martijn Pieters,您能解释一下为什么我们应该“在真正的web服务器上部署Flask,而不是在内置(开发)服务器上部署它吗?”?Thanks@Alexis.Rolland:未配备内置服务器