【问题标题】:Can't make Restplus Flask API run using uWSGI无法使用 uWSGI 运行 Restplus Flask API
【发布时间】:2018-08-07 06:35:21
【问题描述】:

我正在开发一个运行良好的 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

我已经尝试了所有想到的方法,但没有解决这个问题。我做过的一些事情是:

  1. 包含以下代码:

    从 werkzeug.contrib.fixers 导入 ProxyFix flask_app.wsgi_app = ProxyFix(flask_app.wsgi_app)

  2. 删除app.run() (Flask Gunicorn app can't get __name__ to equal '__main__')

  3. 将 function_calls 移到 main 函数之外,否则只有在直接运行 app.py 时才会调用它们,类似于 (Flask application with Blueprints+uWSGI+nginx returning 404's (no routing?))

我真的不知道还有什么问题。我发现了一个类似的问题,但它不适用于我的情况,因为它与我尚未使用的 NGINX 相关(How to deploy a flask-restplus app with nginx + uwgsi)。有什么想法我还能尝试吗?也许我错过了一些明显的东西,因此没睡多少觉。

【问题讨论】:

    标签: python api flask uwsgi flask-restplus


    【解决方案1】:

    initialize_app 中的所有内容都对 wsgi 服务器不可见,这将起作用

    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()
    

    【讨论】:

      【解决方案2】:

      你在一个 wsgi 服务器永远不会看到的函数中调用你的 app.register_blueprint。

      我猜你已经按照某种指南制作了这些不错的功能,供你配置/初始化等应用程序。 但它似乎纯粹是为开发服务器制作的。

      您必须在函数之外调用 Blueprint 和 init_app,或者创建一个新的 wsgi.py 文件来导入 app,然后运行 ​​Blueprint 和 api.init_app 命令。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-20
        • 1970-01-01
        • 2022-06-29
        • 2020-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多