Flask学习笔记(2):类视图
类视图分为标准类视图和基于请求方法的类视图。
标准类视图
注意:
1、标准类视图必须继承自flask.views.View;
2、必须重写dispatch_request()方法,其返回值跟以前的视图函数返回值一样;
3、必须通过add_url_rule()方法建立起url规则和视图函数之间的映射关系;
4、view_func本来为视图函数名,但在类视图中不存在视图函数,故通过调用类方法as_view()传入一个视图函数名;
5、对于endpoint,指定则在url_for反转时用指定值,不指定则在url_for反转时直接用as_view()中传入的视图函数名。
基于请求方法的类视图
在之前的视图函数中用if判断语句判断客户端的请求方法是什么,get或post,再根据请求方法来返回相应的模板或做进一步处理,如在登录过程中验证登录信息是否正确等。现在通过类视图来实现这种功能。
以用户登录为例:
这里将渲染模板操作抽离成一个私有方法,在get或post方法里调用;
该类继承自flask.view.MethodView,可根据用户的请求方式执行对应的get或post或其他方法。在post请求中对请求数据做了些基本的必要验证。
前端html代码如下:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>login</title> 6 </head> 7 <body> 8 <form action="" method="post"> 9 <table> 10 <tr> 11 <td>用户名:</td> 12 <td><input type="text" name="username" ></td> 13 </tr> 14 <tr> 15 <td>密码:</td> 16 <td><input type="password" name="password" ></td> 17 </tr> 18 <tr> 19 <td></td> 20 <td><input type="submit" value="立即登录" ></td> 21 </tr> 22 </table> 23 </form> 24 {% if error %} 25 <p style="color: red">{{ error }}</p> 26 {% endif %} 27 28 </body> 29 </html>
请求结果:
类视图的装饰器
假如有个需求,只有登录状态下才能查看用户个人中心。
先写个装饰器函数login_required,对视图函数profiles()进行装饰,注意,这里从functools导入了wraps装饰器对wrapper函数进行了内部装饰,
至于为什么这么做我也不太清楚,没看懂wraps里面的partial这个类。但是加不加这个装饰器有个区别体现在视图函数里面的print(xxx.__name__)的输出内容,
加wraps装饰器的结果是:profiles;不加则是:wrapper。
不加的时候很好理解,内层装饰器login_required相当于: profiles = login_required(profiles)=wrapper。
这样一来直接访问个人中心会提示:
加上用户名参数后:
现在在类视图里添加装饰器:
定义一个类视图,直接在里面的decorators属性里加入装饰器名称即可。
访问结果: