找回密码
 立即注册

即插视图

2022-2-22 10:45| 发布者: 笨鸟自学网| 查看: 3132| 评论: 0

摘要: 0.7 新版功能.Flask 0.7 引入了即插视图,灵感来自 Django 的基于类而不是函数的通用视图。 其主要目的是让你可以对已实现的部分进行替换,并且这个方式可以定制即插视 图。基本原则想象你有一个从数据库载入一个对 ...


方法提示

即插视图可以像常规函数一样用 route() 或更好的 add_url_rule() 附加到应用中。然而当你附加它时,你必须 提供 HTTP 方法的名称。为了将这个信息加入到类中,你可以提供 methods 属性来承载它:

class MyView(View):
    methods = ['GET', 'POST']

    def dispatch_request(self):
        if request.method == 'POST':
            ...
        ...

app.add_url_rule('/myview', view_func=MyView.as_view('myview'))

基于调度的方法

对每个 HTTP 方法执行不同的函数,对 RESTful API 非常有用。你可以通过 flask.views.MethodView 容易地实现。每个 HTTP 方法映射到同名函数 (只有名称为小写的):

from flask.views import MethodView

class UserAPI(MethodView):

    def get(self):
        users = User.query.all()
        ...

    def post(self):
        user = User.from_form_data(request.form)
        ...

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

如此,你可以不提供 methods 属性。它会自动的按照 类中定义的方法来设置。

装饰视图

既然视图类自己不是加入到路由系统的视图函数,那么装饰视图类并没有多大意义。 相反的,你可以手动装饰 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)

从 Flask 0.8 开始,你也有一种在类声明中设定一个装饰器列表的方法:

class UserAPI(MethodView):
    decorators = [user_required]

因为从调用者的视角来看 self 是不明确的,所以你不能在单独的视图方法上使用 常规的视图装饰器,请记住这些。


上一篇:信号下一篇:应用上下文

Archiver|手机版|笨鸟自学网 ( 粤ICP备20019910号 )

GMT+8, 2025-8-31 00:54 , Processed in 0.014714 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2017 Discuz Team. Template By 【未来科技】【 www.wekei.cn 】

返回顶部