之前我们接触的视图都是函数,所以一般简称为视图函数。其实视图函数也可以基于类来实现,类视图的好处是支持继承,写完类视图需要通过app.add_url_rule(url_rule, view_func)来进行注册

标准类视图

1、标准类视图必须继承flask.views.View

2、必须实现dispatch_request方法,以后请求过来后,都会执行这个方法,这个方法的返回值相当于之前的视图函数一样,也必须返回Response或者子类的对象,或者是字符串、元祖

3、必须通过app.add_url_rule(rule, endpoint, view_func)来做url与视图的映射,view_func这个参数,需要使用as_view类方法转换

4、如果指定了endpoint,那么在使用url_for反转的时候就必须使用endpoint指定的那个值。如果没有指定endpoint,那么就可以使用as_view(视图名字)中指定的视图名字来作为反转

...
from flask import views class ListView(views.View):
def dispatch_request(self):
return 'my list' app.add_url_rule(rule='/list/', endpoint='list', view_func=ListView.as_view('list'))

view_func=ListView.as_view('list')为什么要这样用呢,这是因为view_func是接收函数的,而ListView是一个类,通过as_view方法转换出来的就是一个函数,而这个函数实际上就是dispatch_request, 里面的‘list’是给这个视图函数取的一个名字。 我们可以按住ctrl点击as_view查看源码,就知道返回的是dispatch_request

对比类视图和函数视图,似乎类视图用起来的比麻烦。其实在很多场景是有用处的,因为类可以继承,这里我们来举个例子:
比如在登录页面和注册页面,我们都放一个同样的广告,如果我们是视图函数,就需要这样写:

@app.route('/login/')
def login():
context = {
'ads': 'python入门到精通'
}
return render_template('login.html', **context) @app.route('/register/')
def register():
context = {
'ads': 'Python入门到精通'
}
return render_template('register.html', **context)

使用这种方法明显存在一个缺点:就是当广告需要更换的时候,两个视图函数都需要更改,如果我们使用类视图,就可以使用继承来解决

class AdsView(views.View):
def __init__(self):
super().__init__()
self.context = {
'ads': 'Python高级进阶'
} class LoginView(AdsView):
def dispatch_request(self):
return render_template('login.html', **self.context) class RegisterView(AdsView):
def dispatch_request(self):
return render_template('login.html', **self.context) app.add_url_rule(rule='/login/', endpoint='login', view_func=LoginView.as_view('login'))
app.add_url_rule(rule='/register/', endpoint='register', view_func=RegisterView.as_view('register'))

基于调度方法的类视图

Flask还为我们提供了另外一种类视图flask.views.MethodView,对每个HTTP方法执行不同的函数

我们来模拟做一个登录页面,  一般登录我们会用到两种方法,当进入登录页面的时候我们会用get方法,当我们填好表单点击登录的时候会用到post方法

class LoginView(views.MethodView):
def get(self):
return render_template('login.html') def post(self):
username = request.form.get('username')
password = request.form.get('password')
if username == 'heboan' and password == '':
return '登录成功'
else:
return render_template('login.html', error='登录失败') app.add_url_rule(rule='/login/', endpoint='login', view_func=LoginView.as_view('login'))

login.html

<form action="" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input name="username" type="text" /></td>
</tr> <tr>
<td>密码:</td>
<td><input name="password" type="password" /></td>
</tr>
<tr>
<td><input type="submit" value="登录"></td>
</tr>
</table> {% if error %}
<p style="color: red">登录失败</p>
{% endif %} </form>

其实还可以对这段代码进行优化。我们发现我们一开是进入登录页面,和登录失败都是返回login.html

class LoginView(views.MethodView):
def __render(self, error=None):
return render_template('login.html', error=error) def get(self):
return self.__render() def post(self):
username = request.form.get('username')
password = request.form.get('password')
if username == 'heboan' and password == '':
return '登录成功'
else:
return self.__render(error='登录失败') app.add_url_rule(rule='/login/', view_func=LoginView.as_view('login'))

9、Flask实战第9天:类视图的更多相关文章

  1. Flask实战第6天:视图函数Response返回值

    视图函数的返回值会被自动转换为一个响应对象,Flask的转换逻辑如下: 如果返回的是一个合法的响应对象,则直接返回 可以使用make_response函数来创建Response对象,这个方法可以设置额 ...

  2. 6、Flask实战第6天:视图函数Response返回值

    视图函数的返回值会被自动转换为一个响应对象,Flask的转换逻辑如下: 如果返回的是一个合法的响应对象,则直接返回 可以使用make_response函数来创建Response对象,这个方法可以设置额 ...

  3. Flask(10)- 标准类视图

    前言 前面文章讲解 Flask 路由的时候,都是将 URL 路径和一个视图函数关联 当 Flask 框架接收到请求后,会根据请求 URL,调用响应的视图函数进行处理 Flask 不仅提供了视图函数来处 ...

  4. 10、Flask实战第10天:视图使用装饰器

    在实际开发中,我们有时候会用到自己定义装饰器并应用到函数视图或者类视图里面:比如:我们要想进入个人中心页面,首先要验证你是否登录,否则进不去,下面我们来模拟这个场景 定义一个装饰器 from func ...

  5. Flask初学者:视图函数和类视图

    当一个url请求进入后台时,一般有两种方式来进行处理:视图函数和类视图.视图函数直接使用一个函数来进行处理并返回数据给浏览器,类视图则是使用类来进行处理并返回的,所以当需要进行的处理比较简单,则可以考 ...

  6. Django学习笔记第九篇--实战练习五--关于数据的改、删操作、数据库字段属性的设置和类视图

    一.首先上代码.关于类视图: class register(View): #template_name = "templates/register.html" def get(se ...

  7. Flask实战-留言板-安装虚拟环境、使用包组织代码

    Flask实战 留言板 创建项目目录messageboard,从GreyLi的代码中把Pipfile和Pipfile.lock文件拷贝过来,这两个文件中定义了虚拟环境中需要安装的包的信息和位置,进入m ...

  8. 31、Flask实战第31天:cms后台修改密码

    cms后台修改密码界面布局 先创建cms_resetpwd.html页面,继承cms_base.html {% extends 'cms/cms_base.html' %} {% block titl ...

  9. 7、Flask实战第7天:Jinjia2模板

    Jinja2模板介绍和查找路径 在前面的章节中,视图只是直接返回文本,然而在实际生产环境中其实很少这样用,因为实际的页面大多带有样式和复杂逻辑的HTML代码,这可以让浏览器其渲染出非常漂亮的页面. 我 ...

随机推荐

  1. ZJOI2018 Day2 滚粗记 + 流水账

    一脸懵逼地就被直接拉过来浙江省选了,一年参加两次省选成就达成-- 讲课啥的都没听,过去休息了一天就进行比赛了.考试之前感冒没好透,精神不是 \(100\%\) 的状态,但是并无大碍(反正最后都很凉). ...

  2. [CF1066C]Books Queries

    题目大意:维护一个数列,要求在左边插入一个数,在右边插入一个数,查询一个数的排名 题解:可以双指针,开个数组存每个数的位置 卡点:无 C++ Code: #include <cstdio> ...

  3. [洛谷P4238]【模板】多项式求逆

    题目大意:多项式求逆 题解:$ A^{-1}(x) = (2 - B(x) * A(x)) \times B(x) \pmod{x^n} $ ($B(x)$ 为$A(x)$在$x^{\lceil \d ...

  4. Visio中ShapeAdded和SelectionAdded

    SelectionAdded 和 ShapeAdded 事件的相似之处在于它们都在创建形状之后触发.它们的区别在于,当单个操作添加多个形状时它们的行为方式不同.假定一个 Paste 操作创建三个新建形 ...

  5. MySQL使用笔记(一)安装配置

    By francis_hao    Nov 27,2016   一般软件的安装都是可以通过源码和安装包安装,源码安装可配置性好些,安装包安装比较省事,况且使用yum也可以解决依赖的问题,基本实现了一键 ...

  6. [fzu 2273]判断两个三角形的位置关系

    首先判断是否相交,就是枚举3*3对边的相交关系. 如果不相交,判断包含还是相离,就是判断点在三角形内还是三角形外.两边各判断一次. //http://acm.fzu.edu.cn/problem.ph ...

  7. 说明exit()函数作用的程序

    // algo1-4.cpp 说明exit()函数作用的程序 #include"c1.h" int a(int i) { if(i==1) { printf("退出程序的 ...

  8. 转载:Java中的String与常量池

    转载自http://developer.51cto.com/art/201106/266454.htm.感觉总结的不错,自己收藏一下. string是java中的字符串.String类是不可变的,对S ...

  9. 区间(bzoj 4653)

    Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x ...

  10. 关于flume的几道题

    1,要求:监听一个tcp,udp端口41414将数据打印在控制台 # example.conf: A single-node Flume configuration # Name the compon ...