9、Flask实战第9天:类视图
之前我们接触的视图都是函数,所以一般简称为视图函数。其实视图函数也可以基于类来实现,类视图的好处是支持继承,写完类视图需要通过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天:类视图的更多相关文章
- Flask实战第6天:视图函数Response返回值
视图函数的返回值会被自动转换为一个响应对象,Flask的转换逻辑如下: 如果返回的是一个合法的响应对象,则直接返回 可以使用make_response函数来创建Response对象,这个方法可以设置额 ...
- 6、Flask实战第6天:视图函数Response返回值
视图函数的返回值会被自动转换为一个响应对象,Flask的转换逻辑如下: 如果返回的是一个合法的响应对象,则直接返回 可以使用make_response函数来创建Response对象,这个方法可以设置额 ...
- Flask(10)- 标准类视图
前言 前面文章讲解 Flask 路由的时候,都是将 URL 路径和一个视图函数关联 当 Flask 框架接收到请求后,会根据请求 URL,调用响应的视图函数进行处理 Flask 不仅提供了视图函数来处 ...
- 10、Flask实战第10天:视图使用装饰器
在实际开发中,我们有时候会用到自己定义装饰器并应用到函数视图或者类视图里面:比如:我们要想进入个人中心页面,首先要验证你是否登录,否则进不去,下面我们来模拟这个场景 定义一个装饰器 from func ...
- Flask初学者:视图函数和类视图
当一个url请求进入后台时,一般有两种方式来进行处理:视图函数和类视图.视图函数直接使用一个函数来进行处理并返回数据给浏览器,类视图则是使用类来进行处理并返回的,所以当需要进行的处理比较简单,则可以考 ...
- Django学习笔记第九篇--实战练习五--关于数据的改、删操作、数据库字段属性的设置和类视图
一.首先上代码.关于类视图: class register(View): #template_name = "templates/register.html" def get(se ...
- Flask实战-留言板-安装虚拟环境、使用包组织代码
Flask实战 留言板 创建项目目录messageboard,从GreyLi的代码中把Pipfile和Pipfile.lock文件拷贝过来,这两个文件中定义了虚拟环境中需要安装的包的信息和位置,进入m ...
- 31、Flask实战第31天:cms后台修改密码
cms后台修改密码界面布局 先创建cms_resetpwd.html页面,继承cms_base.html {% extends 'cms/cms_base.html' %} {% block titl ...
- 7、Flask实战第7天:Jinjia2模板
Jinja2模板介绍和查找路径 在前面的章节中,视图只是直接返回文本,然而在实际生产环境中其实很少这样用,因为实际的页面大多带有样式和复杂逻辑的HTML代码,这可以让浏览器其渲染出非常漂亮的页面. 我 ...
随机推荐
- Reasons to use innodb_file_per_table
When working with InnoDB, you have two ways for managing the tablespace storage: Throw everything in ...
- web上传组件
uploadify jquery插件. common-fileipload; common-io ;jar
- vueJS 一天上手到精通
近来用vuejs, vuejs和angular的不同在于它直接暴露了一个构造函数,而后在里面写各种config, 和模板再相对,而且vuejs也有对应的模板双向绑定机制,这样就使开发非常简单容易,虽然 ...
- [bzoj3231][SDOI2008]递归数列——矩阵乘法
题目大意: 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj和 cj ...
- react框架
react 其实react=vue, 区别:vue- 双向数据绑定, react 单向数据绑定. 中文文档:https://react.docschina.org/ 第一步:安装方式,不能直接引入 ...
- Linux下Tomcat开机自动启动
linux下tomcat开机自动启动有两种方法,一种是简单,一种是复杂而又专业的,使用shell脚本要实现,我们一般推荐shell脚本启动方式.下面我们分别介绍这两种方法. 1.shell脚本启动 众 ...
- python-列表 字典 集合 元祖 字符串的相关总结练习
1.执行python脚本的两种方式指定解释器执行在交互器中执行 2.简述位.字节的关系:ASCII1个二进制位是计算机里的最小表示单元1个字节是计算机里最小的储存单元二进制位=8bits(位)8bit ...
- ZigBee MAC层(上)
1. 介绍 ZigBee MAC层,即IEEE 802.15.4 MAC层,这里主要介绍了802.15.4-2003版本 MAC层处理所有对物理无线信道的访问控制,并负责下面的任务 - 为协调器生成网 ...
- iOS推送原理和证书生成简介
1. 推送流程: Provider: 我们自己的后台服务器: APNS: 苹果的消息推送服务器 (1) 当Provider有消息要推送给手机的时候,先将消息和deviceToken等字段发送到APNS ...
- 判断re模块的布尔值
示例: #!/usr/bin/python # coding:utf-8 # Author:Guido's admirers import re import time class card(obje ...