在前面的两篇教程中,你已经接触到了视图,只是我没有指出什么是视图。编程中的许多概念,并不能像生活中的许多概念一样找到一个具体的与之相对应的实物,比如我说鸡蛋,你立刻想到了鸡蛋的样子。我说flask 视图,即便是明白了解的人,也难以准确的想到一个具体的实物与之相对应,这一点,你要习惯。
@app.route('/hello')
def hello():
return 'hello'
通过route装饰器,将一个url /hello 与 函数hello 关联在一起,我们称这个函数就是视图函数。请注意,视图函数并不是python中的概念,而是flask中的一个概念,一个视图函数用来处理一个请求,最终返回数据。
基于函数的视图是最简单便捷的用法,出于设计模式的考虑,如果能用类来处理请求,某些情况下,系统架构会更加合理,更易于扩展。
flask提供了两个两个视图类,我们可以继承这两个类中的一个,实现自己的类视图
继承flask.views.View,必须实现dispatch_request方法以处理请求,下面是一个简单的示例
from flask import Flask, request
from flask.views import View
app = Flask(__name__)
class UserView(View):
methods = ['GET']
def dispatch_request(self):
print(request.method)
return 'ok'
app.add_url_rule('/users', view_func=UserView.as_view('users'))
if __name__ == '__main__':
app.run(debug=True)
as_view方法返回的是一个View类里的一个方法,类里的方法本质上仍然是函数, methods 规定这个视图类可以处理的请求方法。
这样设计,我们可以把处理请求的相关代码抽象成不同的方法写在UserView类里,这样便于管理。
个人更喜欢MethodView,View类里,如果一个资源支持多种请求方式,get,post,put,delete等等,那么你不得不在dispatch_request方法里根据request.method对他们进行区分,然后调用不同的处理方法进行响应,对各种请求的路由是由你自己完成的。
而MethodView则帮你做好了路由,不同的请求,会被路由到不同的处理方法上
from flask import Flask, request
from flask.views import MethodView
app = Flask(__name__)
class UserView(MethodView):
def get(self):
return "收到get请求"
def post(self):
return '收到post请求'
app.add_url_rule('/users', view_func=UserView.as_view('users'))
if __name__ == '__main__':
app.run(debug=True)
这种设计和tornado的处理方式是一样的,MethodView是View的子类,它实现了dispatch_request方法,如果请求的get请求,则路由到get方法,就是这么简单
QQ交流群: 211426309