无法使用 uWSGI 制作 Restplus Flask API 运行
Can't make Restplus Flask API run using uWSGI
我正在开发一个工作正常的 Flask API。我现在正尝试用 uWSGI 替换 Flask 开发服务器,但一切都坏了。自 2 天以来,我一直在尝试解决此问题,浏览了教程并在此处进行了搜索,但找不到问题的解决方案。这是代码:
app.py
import logging.config
import settings
import utils
from flask import Flask, Blueprint
from flask_restplus import Resource, Api
from flask_cors import CORS
from api.restplus import api
from api.gan.endpoints.client import ns as gan_client_namespace
# create Flask application
app = Flask(__name__)
CORS(app) # needed for cross-domain requests, allow everything by default
# load logging confoguration and create log object
logging.config.fileConfig('logging.conf')
log = logging.getLogger(__name__)
#
@app.route("/")
def hello():
return "Hello World!"
def __get_flask_server_params__():
'''
Returns connection parameters of the Flask application
:return: Tripple of server name, server port and debug settings
'''
server_name = utils.get_env_var_setting('FLASK_SERVER_NAME', settings.DEFAULT_FLASK_SERVER_NAME)
server_port = utils.get_env_var_setting('FLASK_SERVER_PORT', settings.DEFAULT_FLASK_SERVER_PORT)
flask_debug = utils.get_env_var_setting('FLASK_DEBUG', settings.DEFAULT_FLASK_DEBUG)
flask_debug = True if flask_debug == '1' else False
return server_name, server_port, flask_debug
def configure_app(flask_app, server_name, server_port):
'''
Configure Flask application
:param flask_app: instance of Flask() class
'''
flask_app.config['SERVER_NAME'] = server_name + ':' + server_port
flask_app.config['SWAGGER_UI_DOC_EXPANSION'] = settings.RESTPLUS_SWAGGER_UI_DOC_EXPANSION
flask_app.config['RESTPLUS_VALIDATE'] = settings.RESTPLUS_VALIDATE
flask_app.config['RESTPLUS_MASK_SWAGGER'] = settings.RESTPLUS_MASK_SWAGGER
flask_app.config['ERROR_404_HELP'] = settings.RESTPLUS_ERROR_404_HELP
def initialize_app(flask_app, server_name, server_port):
'''
Initialize Flask application with Flask-RestPlus
:param flask_app: instance of Flask() class
'''
blueprint = Blueprint('tf_api', __name__, url_prefix='/tf_api')
configure_app(flask_app, server_name, server_port)
api.init_app(blueprint)
api.add_namespace(gan_client_namespace)
flask_app.register_blueprint(blueprint)
#from werkzeug.contrib.fixers import ProxyFix
#flask_app.wsgi_app = ProxyFix(flask_app.wsgi_app)
def main():
server_name, server_port, flask_debug = __get_flask_server_params__()
initialize_app(app, server_name, server_port)
log.info(
'>>>>> Starting TF Serving client at http://{}/ >>>>>'.format(app.config['SERVER_NAME'])
)
app.run(debug=flask_debug, host=server_name)
if __name__ == '__main__':
main()
当我 运行 使用 python app.py
时,它工作正常。
Command Line Message
0.0.0.0:5001
0.0.0.0:5001/tf_api
现在我只是尝试使用 uWSGI 获得相同的结果:
uwsgi --http :8000 --wsgi-file app.py --callable app
命令行消息看起来不错:
Command Line Message
访问 0.0.0.0:8000 也有效
0.0.0.0:8000
但是,当我尝试访问 API 时失败了:
0.0.0.0:8000/tf_api
我已经尝试了所有想到的方法,但没能解决这个问题。我做的一些事情是:
包括以下代码:
从 werkzeug.contrib.fixers 导入 ProxyFix
flask_app.wsgi_app = ProxyFix(flask_app.wsgi_app)
移除app.run()
(Flask Gunicorn app can't get __name__ to equal '__main__')
将function_calls移到主函数之外,否则它们只会在运行宁app.py时直接调用,类似于(Flask application with Blueprints+uWSGI+nginx returning 404's (no routing?))
我真的不知道还有什么问题。我发现了一个类似的问题,但它不适用于我的情况,因为它与我尚未使用的 NGINX 有关 (How to deploy a flask-restplus app with nginx + uwgsi)。任何想法我还能尝试什么?也许我错过了一些明显的东西,因此没有睡太多。
您在 wsgi 服务器永远不会看到的函数中调用您的 app.register_blueprint。
我猜您已经遵循了某种指南,这些指南为您 configure/initialise 等应用程序提供了这些不错的功能。
但它看起来纯粹是为开发服务器制作的。
您必须在函数外调用 Blueprint 和 init_app,或者创建一个新的 wsgi.py 文件导入应用程序,然后运行 Blueprint 和 api.init_app 命令。
wsgi 服务器看不到 initialize_app 中的所有内容,这会起作用
import logging.config
import settings
import utils
from flask import Flask, Blueprint
from flask_restplus import Resource, Api
from flask_cors import CORS
from api.restplus import api
from api.gan.endpoints.client import ns as gan_client_namespace
# create Flask application
app = Flask(__name__)
CORS(app) # needed for cross-domain requests, allow everything by default
# load logging confoguration and create log object
logging.config.fileConfig('logging.conf')
log = logging.getLogger(__name__)
#
@app.route("/")
def hello():
return "Hello World!"
server_name = utils.get_env_var_setting('FLASK_SERVER_NAME', settings.DEFAULT_FLASK_SERVER_NAME)
server_port = utils.get_env_var_setting('FLASK_SERVER_PORT', settings.DEFAULT_FLASK_SERVER_PORT)
flask_debug = utils.get_env_var_setting('FLASK_DEBUG', settings.DEFAULT_FLASK_DEBUG)
flask_debug = True if flask_debug == '1' else False
app.config['SERVER_NAME'] = server_name + ':' + server_port
app.config['SWAGGER_UI_DOC_EXPANSION'] = settings.RESTPLUS_SWAGGER_UI_DOC_EXPANSION
app.config['RESTPLUS_VALIDATE'] = settings.RESTPLUS_VALIDATE
app.config['RESTPLUS_MASK_SWAGGER'] = settings.RESTPLUS_MASK_SWAGGER
app.config['ERROR_404_HELP'] = settings.RESTPLUS_ERROR_404_HELP
blueprint = Blueprint('tf_api', __name__, url_prefix='/tf_api')
api.init_app(blueprint)
api.add_namespace(gan_client_namespace)
flask_app.register_blueprint(blueprint)
def main():
log.info(
'>>>>> Starting TF Serving client at http://{}/ >>>>>'.format(app.config['SERVER_NAME'])
)
app.run(debug=flask_debug, host=server_name)
if __name__ == '__main__':
main()
我正在开发一个工作正常的 Flask API。我现在正尝试用 uWSGI 替换 Flask 开发服务器,但一切都坏了。自 2 天以来,我一直在尝试解决此问题,浏览了教程并在此处进行了搜索,但找不到问题的解决方案。这是代码: app.py
import logging.config
import settings
import utils
from flask import Flask, Blueprint
from flask_restplus import Resource, Api
from flask_cors import CORS
from api.restplus import api
from api.gan.endpoints.client import ns as gan_client_namespace
# create Flask application
app = Flask(__name__)
CORS(app) # needed for cross-domain requests, allow everything by default
# load logging confoguration and create log object
logging.config.fileConfig('logging.conf')
log = logging.getLogger(__name__)
#
@app.route("/")
def hello():
return "Hello World!"
def __get_flask_server_params__():
'''
Returns connection parameters of the Flask application
:return: Tripple of server name, server port and debug settings
'''
server_name = utils.get_env_var_setting('FLASK_SERVER_NAME', settings.DEFAULT_FLASK_SERVER_NAME)
server_port = utils.get_env_var_setting('FLASK_SERVER_PORT', settings.DEFAULT_FLASK_SERVER_PORT)
flask_debug = utils.get_env_var_setting('FLASK_DEBUG', settings.DEFAULT_FLASK_DEBUG)
flask_debug = True if flask_debug == '1' else False
return server_name, server_port, flask_debug
def configure_app(flask_app, server_name, server_port):
'''
Configure Flask application
:param flask_app: instance of Flask() class
'''
flask_app.config['SERVER_NAME'] = server_name + ':' + server_port
flask_app.config['SWAGGER_UI_DOC_EXPANSION'] = settings.RESTPLUS_SWAGGER_UI_DOC_EXPANSION
flask_app.config['RESTPLUS_VALIDATE'] = settings.RESTPLUS_VALIDATE
flask_app.config['RESTPLUS_MASK_SWAGGER'] = settings.RESTPLUS_MASK_SWAGGER
flask_app.config['ERROR_404_HELP'] = settings.RESTPLUS_ERROR_404_HELP
def initialize_app(flask_app, server_name, server_port):
'''
Initialize Flask application with Flask-RestPlus
:param flask_app: instance of Flask() class
'''
blueprint = Blueprint('tf_api', __name__, url_prefix='/tf_api')
configure_app(flask_app, server_name, server_port)
api.init_app(blueprint)
api.add_namespace(gan_client_namespace)
flask_app.register_blueprint(blueprint)
#from werkzeug.contrib.fixers import ProxyFix
#flask_app.wsgi_app = ProxyFix(flask_app.wsgi_app)
def main():
server_name, server_port, flask_debug = __get_flask_server_params__()
initialize_app(app, server_name, server_port)
log.info(
'>>>>> Starting TF Serving client at http://{}/ >>>>>'.format(app.config['SERVER_NAME'])
)
app.run(debug=flask_debug, host=server_name)
if __name__ == '__main__':
main()
当我 运行 使用 python app.py
时,它工作正常。
Command Line Message
0.0.0.0:5001
0.0.0.0:5001/tf_api
现在我只是尝试使用 uWSGI 获得相同的结果:
uwsgi --http :8000 --wsgi-file app.py --callable app
命令行消息看起来不错:
Command Line Message
访问 0.0.0.0:8000 也有效
0.0.0.0:8000
但是,当我尝试访问 API 时失败了: 0.0.0.0:8000/tf_api
我已经尝试了所有想到的方法,但没能解决这个问题。我做的一些事情是:
包括以下代码:
从 werkzeug.contrib.fixers 导入 ProxyFix flask_app.wsgi_app = ProxyFix(flask_app.wsgi_app)
移除
app.run()
(Flask Gunicorn app can't get __name__ to equal '__main__')将function_calls移到主函数之外,否则它们只会在运行宁app.py时直接调用,类似于(Flask application with Blueprints+uWSGI+nginx returning 404's (no routing?))
我真的不知道还有什么问题。我发现了一个类似的问题,但它不适用于我的情况,因为它与我尚未使用的 NGINX 有关 (How to deploy a flask-restplus app with nginx + uwgsi)。任何想法我还能尝试什么?也许我错过了一些明显的东西,因此没有睡太多。
您在 wsgi 服务器永远不会看到的函数中调用您的 app.register_blueprint。
我猜您已经遵循了某种指南,这些指南为您 configure/initialise 等应用程序提供了这些不错的功能。 但它看起来纯粹是为开发服务器制作的。
您必须在函数外调用 Blueprint 和 init_app,或者创建一个新的 wsgi.py 文件导入应用程序,然后运行 Blueprint 和 api.init_app 命令。
wsgi 服务器看不到 initialize_app 中的所有内容,这会起作用
import logging.config
import settings
import utils
from flask import Flask, Blueprint
from flask_restplus import Resource, Api
from flask_cors import CORS
from api.restplus import api
from api.gan.endpoints.client import ns as gan_client_namespace
# create Flask application
app = Flask(__name__)
CORS(app) # needed for cross-domain requests, allow everything by default
# load logging confoguration and create log object
logging.config.fileConfig('logging.conf')
log = logging.getLogger(__name__)
#
@app.route("/")
def hello():
return "Hello World!"
server_name = utils.get_env_var_setting('FLASK_SERVER_NAME', settings.DEFAULT_FLASK_SERVER_NAME)
server_port = utils.get_env_var_setting('FLASK_SERVER_PORT', settings.DEFAULT_FLASK_SERVER_PORT)
flask_debug = utils.get_env_var_setting('FLASK_DEBUG', settings.DEFAULT_FLASK_DEBUG)
flask_debug = True if flask_debug == '1' else False
app.config['SERVER_NAME'] = server_name + ':' + server_port
app.config['SWAGGER_UI_DOC_EXPANSION'] = settings.RESTPLUS_SWAGGER_UI_DOC_EXPANSION
app.config['RESTPLUS_VALIDATE'] = settings.RESTPLUS_VALIDATE
app.config['RESTPLUS_MASK_SWAGGER'] = settings.RESTPLUS_MASK_SWAGGER
app.config['ERROR_404_HELP'] = settings.RESTPLUS_ERROR_404_HELP
blueprint = Blueprint('tf_api', __name__, url_prefix='/tf_api')
api.init_app(blueprint)
api.add_namespace(gan_client_namespace)
flask_app.register_blueprint(blueprint)
def main():
log.info(
'>>>>> Starting TF Serving client at http://{}/ >>>>>'.format(app.config['SERVER_NAME'])
)
app.run(debug=flask_debug, host=server_name)
if __name__ == '__main__':
main()