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

Swagger documentation with two or more blueprints

Open PedroLuiz99 opened this issue 5 years ago • 5 comments

Hello! Fist of all, thanks for the awesome project!

So, I work with a flask-restx project with two independent Blueprints, each of them with your own documentation:

bp_mapi = Blueprint('api_mapi', __name__)
api_mapi = Api(bp_mapi,
               title="Harpo Management API",
               version=MAPI_VERSION,
               doc="/mapi/doc",
               prefix='/mapi'
               )
bp_host = Blueprint('api_host', __name__)
api_host = Api(bp_host,
               title="Harpo Host communication API",
               version=MAPI_VERSION,
               doc="/host/doc",
               decorators=[check_host_jwt]
               )

The blueprints are registered in this order:

    app.register_blueprint(bp_host)
    app.register_blueprint(bp_mapi)

The problem is when I try to access /mapi/doc, the project shows the host documentation.

It's an issue or am I forgeting something?

Thanks in advance!

PedroLuiz99 avatar Mar 02 '20 20:03 PedroLuiz99

Since you are using a prefix it will prefix your doc route as well. At the moment, you are using prefix="/mapi" it will prefix your doc="/mapi/doc" which ends up becoming /mapi/mapi/doc. The solution is simply removing /mapi from your doc route, so something like this should do:

api_mapi = Api(bp_mapi,
               title="Harpo Management API",
               version=MAPI_VERSION,
               doc="/doc", # Just remove '/mapi' since you're already prefixing it.
               prefix='/mapi'
               )

X1Zeth2X avatar Mar 03 '20 19:03 X1Zeth2X

Hi, Sorry for the late response.

I've tried this but now the /mapi/doc route gives me a 404 error.

PedroLuiz99 avatar Mar 12 '20 18:03 PedroLuiz99

Sorry I missed another part of your code, but have you tried using app.register_blueprint(bp_mapi, url_prefix="/mapi") instead of applying prefix in the Api itself?

X1Zeth2X avatar Mar 14 '20 12:03 X1Zeth2X

I just ran into the same issue. The root problem is that you "merge" your blueprints by not defining the url_prefix, which is the same what I did as well.

After I set the url_prefix on one of my blueprint I was able to reach both of them.

However, I merge my blueprints on purpose because I don't want to use url prefixes and I want to keep my app in separate modules.

I haven't tried namespaces yet but maybe that's the way to go. I just don't like the idea that I have to keep update my master Api instance by adding new namespaces.

Would be nice to merge the docs as well, if I merge the blueprints.

martincpt avatar Jan 26 '23 10:01 martincpt

Update: I was able to access both of my docs without using url_prefix but using different swagger file name and doc path with default_swagger_filename parameter.

martincpt avatar Jan 28 '23 13:01 martincpt