可插拔视图:基于类的视图,利用类可被继承的特点,可在其他地方被继承使用。
优点:
类是可以被继承的。
代码可以复用。
可定义多种行为。
import time
from flask.views import View
from flask import Flask, request
app = Flask(__name__)
def count_time(f):
def decorator(*args, **kwargs):
st = time.time()
f(*args, **kwargs)
et = time.time()
print(f'耗时:{et - st}秒')
return decorator
class ProjectView(View):
"""可以将与project相关的请求逻辑都封装好,方便dispatch_request分配请求"""
methods = ['GET',"POST"]
decorators = (count_time,)
def get(self):
'处理前端的get请求'
return 'get请求处理逻辑触发 了'
def post(self):
'处理前端的额post请求'
return 'post请求处理逻辑触发了'
def dispatch_request(self): # dispatch_request:为固定写法,不可更改,起分发的作用
dispatch_parttern = {'GET': self.get, 'POST': self.post}
method = request.method
return dispatch_parttern.get(method)()
# 装饰器显示调用
f = ProjectView.as_view('projcet')
# count_time(f)
# 集中注册路由
app.add_url_rule('/project', view_func=f, methods=['GET', 'POST'])
if __name__ == '__main__':
app.run()
MethodView:
from flask import Flask, request
from flask.views import View,MethodView
app = Flask(__name__)
# class MethodView:
#
# def get(self):
# return 'get'
#
# def post(self):
# return 'post'
#
# def dispatch_request(self):
# method = request.method
# func = getattr(self, method, None)
# return func()
class Pro(MethodView):
def get(self,pro_id=None):
if not pro_id:
return 'get all projects'
return f'get{pro_id}'
def put(self):
return 'post'
def delete(self,pro_id=None):
if not pro_id:
pass
return f'delete{pro_id}'
# Pro().dispatch_request()
f = Pro.as_view('pro')
app.add_url_rule('/projects/<pro_id>',view_func=f,methods=['GET',"POST","DELETE"])
app.add_url_rule('/projects/',view_func=f,methods=['GET',],defaults={"pro_id":None})
if __name__ == '__main__':
app.run()