2015-07-14 2 views
1

Я пытаюсь создать сайт, содержащий навигационную панель, используя Flask-Menu и Flask-Breadcrumbs. Декоратор используется как так (Flask-Menu пример):Декорирование Flask Pluggable Views - BuildError

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

Однако я хочу использовать классы MethodView, которые в конечном итоге позволяют для более сложных операций. Шаблон выдержка:

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

Мой код бросает 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')) 

Как правильно декорировать вставных взгляды? Приветствия.

+0

Этот вопрос кажется похожи https://stackoverflow.com/questions/13345030/url-for-builderror-in-flask-extension-with-pluggable-views – dylaan

ответ

2

Есть два варианта для украшения View:

а. Вы можете украсить вручную возвращаемое значение 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. Если вы используете Flask 0.8+, вы можете указать список декораторов, которые будут применяться в объявлении класса.

class UserAPI(MethodView): 
    decorators = [user_required] 
+0

Спасибо, я прочитал это, но не сделал понять, как применить его к моему сценарию. Наверное, я немного поработаю. – dylaan

Смежные вопросы