flask-restplus icon indicating copy to clipboard operation
flask-restplus copied to clipboard

Swagger docs not showing up when using gunicorn

Open rafa-acioly opened this issue 5 years ago • 4 comments

Code

# The run.py file

from decouple import config
from flask import Blueprint

from api import app, application
from api.routes import configure_routes


if __name__ == "__main__":
    blueprint = Blueprint('api', __name__, url_prefix='/api')
    configure_routes(application)
    app.register_blueprint(blueprint)

    app.run(
        host=config('HOST', default='0.0.0.0'),
        debug=config('DEBUG', default=False, cast=bool),
        port=config('PORT', default=5000, cast=int)
    )

Repro Steps (if applicable)

  1. run gunicorn -b localhost:8080 -w 4 run:app
  2. open localhost:8080/docs

Expected Behavior

When i start the app using python run.py the endpoints in docs url are correct.

Captura de Tela 2020-02-22 às 11 12 16

Actual Behavior

When i start the ap using gunicorn the docs url do not show the endpoints

Captura de Tela 2020-02-22 às 11 10 03

Environment

  • Python version: 3.7.2
  • Flask version: 1.1.1
  • Flask-RESTPlus version: 0.13.0
  • Flask-RESTful: 0.3.8

rafa-acioly avatar Feb 22 '20 14:02 rafa-acioly

Any update?

hsweif avatar Oct 15 '20 07:10 hsweif

Python interpreter uses __name__ variable to identify whether python file should be executed as a script or as a module. Everything under __name__ == "__main__" block will be executed only when you call app.py directly from the command line (i.e as a script). When you are calling gunicorn to execute an application, it imports the app.py as a module and all your blueprint configuration is not applied.

andreykurilin avatar Feb 16 '21 11:02 andreykurilin

Not works even if it is outside

SmartManoj avatar Feb 16 '21 11:02 SmartManoj

Please check the following code of the simplified application that covers the whole workflow:

# filename app.py


import flask
import flask_restx


APP = flask.Flask("some-app")
api_bp = flask.Blueprint("v1_api", __name__, url_prefix="/api/v1")

API = flask_restx.Api(api_bp)
APP.register_blueprint(api_bp)


NAMESPACE = flask_restx.Namespace("info")


@NAMESPACE.route("/")
class InfoAPI(flask_restx.Resource):
    def get(self):
        return "something"


API.add_namespace(NAMESPACE)

Should be executed as gunicorn -b localhost:8080 -w 4 app:APP

andreykurilin avatar Feb 16 '21 11:02 andreykurilin