dylaan
dylaan

Reputation: 23

Decorating Flask Pluggable Views - BuildError

I'm trying to create a site containing a navigation bar using Flask-Menu and Flask-Breadcrumbs. A decorator is used like so (Flask-Menu example):

@app.route('/')
@menu.register_menu(app, '.', 'Home')
def index():
    return tmpl_show_menu() #Some view

However, I want to use MethodView classes which will eventually allow for more complex operations. Template excerpt:

{%- for item in current_menu.children -%}
    <a href="{{ item.url}}">{{ item.text }}</a>
{%- endfor -%}

My code throws BuildError: ('contactsApp.SiteView', {}, None)

contactsApp = Blueprint('contactsApp', __name__, template_folder='templates')

@menu.register_menu(contactsApp, '.', 'List')
class ListView(MethodView):

    def get(self):
        contacts = Contact.objects.all()
        return render_template('contacts/list.html', contacts=contacts)

@menu.register_menu(contactsApp, '.site', 'Sites')
class SiteView(MethodView):

    def get(self):
        sites = Site.objects.all()
        return render_template('contacts/sites.html', sites=sites)

contactsApp.add_url_rule('/', view_func=ListView.as_view('list'))
contactsApp.add_url_rule('/site/', view_func=SiteView.as_view('sites'))

How can I correctly decorate the pluggable views? Cheers.

Upvotes: 2

Views: 1014

Answers (1)

doru
doru

Reputation: 9110

There are two options for decorating a View:

a. You can decorate by hand the return value of as_view().

def user_required(f):
    """Checks whether user is logged in or raises error 401."""
    def decorator(*args, **kwargs):
        if not g.user:
            abort(401)
        return f(*args, **kwargs)
    return decorator

view = user_required(UserAPI.as_view('users'))
app.add_url_rule('/users/', view_func=view)

b. If you using Flask 0.8+, you can specify a list of decorators to apply in the class declaration.

class UserAPI(MethodView):
    decorators = [user_required]

Upvotes: 5

Related Questions