装饰 Flask 可插入视图 - BuildError

dyl*_*aan 2 python flask

我正在尝试使用 Flask-Menu 和 Flask-Breadcrumbs 创建一个包含导航栏的网站。装饰器的使用方式如下(Flask-Menu示例):

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

但是,我想使用 MethodView 类,它最终将允许进行更复杂的操作。模板摘录:

{%- for item in current_menu.children -%}
    <a href="{{ item.url}}">{{ item.text }}</a>
{%- endfor -%}
Run Code Online (Sandbox Code Playgroud)

我的代码抛出 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'))
Run Code Online (Sandbox Code Playgroud)

如何正确装饰可插入视图?干杯。

dor*_*oru 5

装饰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)
Run Code Online (Sandbox Code Playgroud)

湾 如果您使用 Flask 0.8+,您可以指定要在类声明中应用的装饰器列表。

class UserAPI(MethodView):
    decorators = [user_required]
Run Code Online (Sandbox Code Playgroud)