marshmallow-code / flask-smorest

DB agnostic framework to build auto-documented REST APIs with Flask and marshmallow
https://flask-smorest.readthedocs.io
MIT License
662 stars 73 forks source link

Hard to use `url_for` in a view #516

Open juledwar opened 1 year ago

juledwar commented 1 year ago

I'm trying to convert my Flask app from flask-restful, and I need to use flask.url_for in some of my pagination helper code that's in my views' base class.

The endpoint value that url_for takes is basically {blueprint.name}.{viewclass.__name__} and in fact this value is calculated and used in the Blueprint.register_views_in_doc method. However while it''s easy to get the view class name, the blueprint name under which the view is registered is not available to the view itself, which means the endpoint name can't be calculated.

At the moment I am basically copy/pasting this same code in every view definition:

    @classmethod
    @property
    def full_endpoint(cls):
           return f'{bp.name}.{cls.__name__}'

but I'd ideally like to make this more automatic by injecting the full_endpoint property when the Blueprint.route code runs to register the view.

lafrech commented 1 year ago

Can't you set this property in the base class?

I guess a more comprehensive code sample would help explaining the problem.

juledwar commented 1 year ago

Can't you set this property in the base class?

You can't do that because the blueprint is not known/available there.

I guess a more comprehensive code sample would help explaining the problem.

The bottom line is that the view class doesn't know to which blueprint it's attached, so views cannot calculate their full endpoint, I need this copypasta code in every view. Instead, it could be refactored in a base view class in such a way that it's calculated when needed.