首页 > 技术文章 > FLask之视图

zhufanyu 2019-11-26 19:52 原文

视图

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)

推荐阅读