noirbizarre / flask-restplus

Fully featured framework for fast, easy and documented API development with Flask
http://flask-restplus.readthedocs.org
Other
2.74k stars 506 forks source link

Swagger docs not showing up when using gunicorn #781

Open rafa-acioly opened 4 years ago

rafa-acioly commented 4 years ago

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

hsweif commented 3 years ago

Any update?

andreykurilin commented 3 years ago

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.

SmartManoj commented 3 years ago

Not works even if it is outside

andreykurilin commented 3 years ago

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