视图
1 FBV
def index():
return render_template('index.html')
app.add_url_rule('/index', 'index', index)
# 公司里一般用这种方式
@app.route('/login')
def login():
return render_template('login.html')
2 CBV
from flask import Flask,render_template,views
app = Flask(__name__,)
# 装饰器1
def test1(func):
def inner(*args,**kwargs):
print('before1')
result = func(*args,**kwargs)
print('after1')
return result
return inner
# 装饰器2
def test2(func):
def inner(*args,**kwargs):
print('before2')
result = func(*args,**kwargs)
print('after2')
return result
return inner
class UserView(views.MethodView):
# 指定访问方法,允许列表中的请求可以执行
methods = ['GET',"POST"]
# 添加装饰器的方法,
decorators = [test1,test2]
def get(self):
print('get')
return 'get'
def post(self):
print('post')
return 'post'
app.add_url_rule('/user', view_func=UserView.as_view('user')) # endpoint
if __name__ == '__main__':
app.run()
解析:
1. 上边cbv中装饰器的执行顺序:
before2
before1
get
after1
after2
# 可以看出这个装饰器的加载顺序是根据你列表中写的顺序执行的;
2. CBV的执行流程梳理:
* 首先是执行"as_view('user')"方法,这个方法继承父类"View"中的方法;
* 然后在这个方法的执行"view"方法,这个方法的返回值是"dispatch_request"方法;
* 这个方法在父类"MethodView"中执行的;
* 在这个"dispatch_request"中执行反射方法,通过你的请求方法找对应的函数去执行,
meth = getattr(self, request.method.lower(), None)