Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
能否将HTTPS功能添加到python flask web服务器?_Python_Rest_Https_Flask - Fatal编程技术网

能否将HTTPS功能添加到python flask web服务器?

能否将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

我正在尝试构建一个web界面来模拟网络设备上的restful界面。这个网络设备使用摘要身份验证和HTTPS。 我知道如何将摘要身份验证集成到web服务器中,但如果您能告诉我如何使用FLASK获得https,我似乎无法找到如何使用FLASK获得https。请评论我需要如何使用下面的代码来实现这一点

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:未配备内置服务器