再次理解 Flask 中视图函数的用法

Author Avatar
patrickcty 8月 02, 2017

再次理解 Flask 中视图函数的用法

使用类描述视图

在 Flask 应用中,通常是用函数来描述视图的,但是如果多个函数都用到某些通用功能则用类实现视图就非常方便。

多个视图函数都要渲染模板

from flask.views import View

class GenericView(View):  # 定义视图类,减少重复
    def __init__(self, template):
        self.template = template
        super(GenericView, self).__init__()

    # 作用和普通视图函数相同
    def dispatch_request(self):
        page = 1
        posts = Post.query.order_by(
            Post.publish_time.desc()
        ).paginate(page, 10)
        recent, top_tags = sidebar_data()

        return render_template(
            self.template,
            posts=posts,
            recent=recent,
            top_tags=top_tags
        )


app.add_url_rule(
    # 第一个参数是 url
    '/test',
    view_func=GenericView.as_view(
        'test',  # 指定 endpoint
        template='home.html'
    )
)

app.add_url_rule(
    # 第一个参数是 url
    '/test2',
    view_func=GenericView.as_view(
        'test',  # 指定 endpoint
        template='index.html'
    )
)

如果要使用多种 HTTP 方法,则定义类属性 methods

class GenericView(View):  # 定义视图类,减少重复
    methods = ['GET', 'POST']  # 定义为类属性
    
    def __init__(self, template):
        ...

    # 作用和普通视图函数相同
    def dispatch_request(self):
        if request.method == 'GET':
            ...
        elif request.method == 'POST':
            ...

使用方法视图

方法视图允许把每种 HTTP 请求的处理函数写成一个同名的类方法

from flask.views import MethodView

class UserView(MethodView):
    def get(self):
        ...
    def post(self):
        ...
    def put(self):
        ...
        
app.add_url_rule('/user', view_func=UserView.as_view('user'))