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

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

使用类描述视图

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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

1
2
3
4
5
6
7
8
9
10
11
12
class GenericView(View):  # 定义视图类,减少重复
methods = ['GET', 'POST'] # 定义为类属性

def __init__(self, template):
...

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

使用方法视图

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

1
2
3
4
5
6
7
8
9
10
11
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'))