在 https 服务器上提供 Flask-RESTPlus
Serving Flask-RESTPlus on https server
我对 python 比较陌生,我使用 flask-resplus 创建了一个微服务。
在我的电脑和使用 http 的开发服务器上运行良好。
我无法控制微服务的部署位置。在这些情况下,它似乎在负载平衡器后面(不确定细节),通过 https 提供。
浏览器给出的实际错误:无法从服务器读取。它可能没有适当的访问控制来源设置。
当我检查网络开发者工具时,我发现它加载失败 swagger.json。但是正在使用以下方法检查它:
http://hostname/api/swagger.json,而不是 https。
我一直在谷歌搜索,并且 运行 进入了 this 问题的讨论。
this 似乎是无需更改服务器上的库或配置即可工作的修复程序。
但是我仍然无法让它工作。
这是我的:
在 api 文件上:
api_blueprint = Blueprint('api', __name__, url_prefix='/api')
api = Api(api_blueprint, doc='/doc/', version='1.0', title='My api',
description="My api")
在主应用程序文件上:
from flask import Flask
from werkzeug.contrib.fixers import ProxyFix
from lib.api import api_blueprint
app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app)
app.register_blueprint(api_blueprint)
还尝试添加:
app.config['SERVER_URL'] = 'http://testfsdf.co.za' # but it dont look like is being considered
使用 flask-restplus==0.9.2,
任何解决方案将不胜感激,只要我不需要在将部署服务的容器上进行配置
(可以设置环境变量),即服务需要自包含。如果有一个版本的 flask-resplus 我可以用 pip 安装,那已经有一个修复程序,我很感激。
非常感谢大家,
在 spec
属性.
中使用 _scheme='https'
选项覆盖 API class
class MyApi(Api):
@property
def specs_url(self):
"""Monkey patch for HTTPS"""
scheme = 'http' if '5000' in self.base_url else 'https'
return url_for(self.endpoint('specs'), _external=True, _scheme=scheme)
api = MyApi(api_blueprint, doc='/doc/', version='1.0', title='My api',
description="My api")
上面的解决方案非常有效。有几件事你应该检查。
在应用修复程序之前,请确保在您的 chrome developertools -> Network 选项卡中,无论何时重新加载页面(在 https 服务器中)这显示了招摇 UI,您收到 swagger.json 请求的混合内容错误。
上面的解决方案 post 解决了部署在 https 服务器上时的问题,但在本地可能会出现问题。为此,您可以使用环境变量技巧。
设置自定义环境变量或部署应用程序时 https 服务器上已有的任何变量。在应用解决方案之前检查该环境变量是否存在,以确保您的应用程序在 https 服务器中 运行ning。
现在,当您 运行 在本地应用程序时,将不会应用此 hack,并且 swagger.json 将通过 http 在您的服务器中提供服务将通过 https 提供。实现可能与此类似。
import os
from flask import url_for
from flask_restplus import Api
app = Flask( __name__)
if os.environ.get('CUSTOM_ENV_VAR'):
@property
def specs_url(self):
return url_for(self.endpoint('specs'), _external=True, _scheme='https')
Api.specs_url = specs_url
api = Api(app)
我对 python 比较陌生,我使用 flask-resplus 创建了一个微服务。 在我的电脑和使用 http 的开发服务器上运行良好。 我无法控制微服务的部署位置。在这些情况下,它似乎在负载平衡器后面(不确定细节),通过 https 提供。
浏览器给出的实际错误:无法从服务器读取。它可能没有适当的访问控制来源设置。
当我检查网络开发者工具时,我发现它加载失败 swagger.json。但是正在使用以下方法检查它: http://hostname/api/swagger.json,而不是 https。
我一直在谷歌搜索,并且 运行 进入了 this 问题的讨论。 this 似乎是无需更改服务器上的库或配置即可工作的修复程序。
但是我仍然无法让它工作。
这是我的:
在 api 文件上:
api_blueprint = Blueprint('api', __name__, url_prefix='/api')
api = Api(api_blueprint, doc='/doc/', version='1.0', title='My api',
description="My api")
在主应用程序文件上:
from flask import Flask
from werkzeug.contrib.fixers import ProxyFix
from lib.api import api_blueprint
app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app)
app.register_blueprint(api_blueprint)
还尝试添加:
app.config['SERVER_URL'] = 'http://testfsdf.co.za' # but it dont look like is being considered
使用 flask-restplus==0.9.2,
任何解决方案将不胜感激,只要我不需要在将部署服务的容器上进行配置 (可以设置环境变量),即服务需要自包含。如果有一个版本的 flask-resplus 我可以用 pip 安装,那已经有一个修复程序,我很感激。
非常感谢大家,
在 spec
属性.
_scheme='https'
选项覆盖 API class
class MyApi(Api):
@property
def specs_url(self):
"""Monkey patch for HTTPS"""
scheme = 'http' if '5000' in self.base_url else 'https'
return url_for(self.endpoint('specs'), _external=True, _scheme=scheme)
api = MyApi(api_blueprint, doc='/doc/', version='1.0', title='My api',
description="My api")
上面的解决方案非常有效。有几件事你应该检查。
在应用修复程序之前,请确保在您的 chrome developertools -> Network 选项卡中,无论何时重新加载页面(在 https 服务器中)这显示了招摇 UI,您收到 swagger.json 请求的混合内容错误。
上面的解决方案 post 解决了部署在 https 服务器上时的问题,但在本地可能会出现问题。为此,您可以使用环境变量技巧。
设置自定义环境变量或部署应用程序时 https 服务器上已有的任何变量。在应用解决方案之前检查该环境变量是否存在,以确保您的应用程序在 https 服务器中 运行ning。
现在,当您 运行 在本地应用程序时,将不会应用此 hack,并且 swagger.json 将通过 http 在您的服务器中提供服务将通过 https 提供。实现可能与此类似。
import os
from flask import url_for
from flask_restplus import Api
app = Flask( __name__)
if os.environ.get('CUSTOM_ENV_VAR'):
@property
def specs_url(self):
return url_for(self.endpoint('specs'), _external=True, _scheme='https')
Api.specs_url = specs_url
api = Api(app)