luolingchun / flask-openapi3

Generate REST API and OpenAPI documentation for your Flask project.
https://luolingchun.github.io/flask-openapi3/
MIT License
203 stars 33 forks source link

provide a way to order the endpoints #168

Open nioncode opened 3 months ago

nioncode commented 3 months ago

Is there a way to modify the order of the endpoints? Currently it seems they are grouped by tags and then sorted alphabetically by their path, which results in non-intuitive ordering (at least in our use case).

Assume we have the endpoints:

Naturally, we'd like to see /start before /finish in the documentation, but currently these are reversed.

It would be great if we could provide a custom name used for sorting, e.g. something like:

@bp.post("/start", sorting_name="1_start")
def start():
    pass

@bp.post("/finish", sorting_name="2_finish")
def finish():
    pass

It would also be possible by using a simple integer for the sort order, but I think having a string and then keep using the alphabetical sorting order allows more customization and is less brittle when adding a new function, since we could also create some kind of subgroups between requests to order some requests relative to each other without impacting global order, e.g.:

@bp.post("/something/start", sorting_name="something_1_start")
def start():
    pass

@bp.post("/something/finish", sorting_name="something_2_finish")
def finish():
    pass

@bp.post("/other/start", sorting_name="other_1_start")
def start2():
    pass

@bp.post("/other/finish", sorting_name="other_2_finish")
def finish2():
    pass

Does something like this maybe already exist?

luolingchun commented 3 months ago

@nioncode If you want to change the endpoint order of the swagger, you can change the default behavior by setting the SWAGGER_CONFIG.

from flask_openapi3 import OpenAPI

app = OpenAPI(__name__)

app.config["SWAGGER_CONFIG"] = {
    "operationsSorter":"method"
}

operationsSorter | Unavailable | Function=(a => a). Apply a sort to the operation list of each API. It can be 'alpha' (sort by paths alphanumerically), 'method' (sort by HTTP method) or a function (see Array.prototype.sort() to know how sort function works). Default is the order returned by the server unchanged.

nioncode commented 1 week ago

Sorry for my late response. Is there a similar flag to control the redoc API?

I found out that the order of the endpoints is actually how they are in our python code in the generated api.json when generating it via flask openapi -o api.json, so I guess it is not the responsibility of flask-openapi3 to sort the endpoints, but of the tool that generates the redoc API afterwards.