Reputation: 23
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
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