简体   繁体   English

装饰Flask可插入视图 - BuildError

[英]Decorating Flask Pluggable Views - BuildError

I'm trying to create a site containing a navigation bar using Flask-Menu and Flask-Breadcrumbs. 我正在尝试使用Flask-Menu和Flask-Breadcrumbs创建一个包含导航栏的站点。 A decorator is used like so ( Flask-Menu example): 像这样使用装饰器( Flask-Menu示例):

@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. 但是,我想使用MethodView类,它最终将允许更复杂的操作。 Template excerpt: 模板摘录:

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

My code throws BuildError: ('contactsApp.SiteView', {}, None) 我的代码抛出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. 干杯。

There are two options for decorating a View : 装饰视图有两种选择:

a. 一种。 You can decorate by hand the return value of as_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. If you using Flask 0.8+, you can specify a list of decorators to apply in the class declaration. 如果使用Flask 0.8+,则可以指定要在类声明中应用的装饰器列表。

class UserAPI(MethodView):
    decorators = [user_required]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM