以往使用的视图都是函数,一般称为视图函数。在Flask框架中视图还可以使用类来实现,使用类视图还是和函数视图有区别的,需要写完类视图后再通过app.add_url_rule(url_rule,view_func)来进行注册。
一、标准类视图标准类视图是继承自flask.views.View,并且在子类中必须实现dispatch_request方法,这个方法类似于视图函数,也要返回一个基于Response或者其子类的对象。
示例代码:
from flask import Flask, render_template
from flask.views import View
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
class PersonView(View):
def dispatch_request(self):
return '我是标准类视图'
# 类视图通过add_url_rule方法和url做映射, 注意:user后面的斜杠不能去掉
app.add_url_rule('/user/', view_func=PersonView.as_view('personalview'))
if __name__ == '__main__':
app.run()
运行效果:
Flask框架还提供了另外一种类视图flask.views.MethodView,对每个HTTP方法执行不同的函数(映射到对应方法的小写的同名方法上)。
示例代码:
from flask import Flask, render_template, request
from flask.views import MethodView
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
class LoginView(MethodView):
# 当客户端页面请求访问时执行get函数
def get(self):
return render_template('login.html')
# 当客户端向页面发送数据post请求时执行post函数
def post(self):
name = request.form.get('name')
password = request.form.get('password')
if name == 'dgw' and password == '666':
return '登录成功!'
else:
return '用户名或密码错误!'
# 类视图通过add_url_rule方法和url做映射, 并且在as_view方法中指定url的名称,方便url_for函数的调用
app.add_url_rule('/login/', view_func=LoginView.as_view('loginview'))
if __name__ == '__main__':
app.run()
当方式get请求时,运行效果:
当方式post请求时,运行效果: 【使用postman工具发起post请求】
当使用类视图时,也可以使用装饰器。如在做权限验证的时候。
装饰器功能写完后,在类视图中定义一个属性叫做decorators,然后存储装饰器。以后每次调用这个类视图的时候,就会执行这个装饰器。
check_auth.py
from flask import session
def login_required(func):
def wrapper(*args, **kwargs):
if not session.get("user_id"):
return 'auth failure'
return func(*args, **kwargs)
return wrapper
main.py
from flask import Flask, render_template, request
from flask.views import MethodView
from check_auth import login_required
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
class LoginView(MethodView):
decorators = [login_required]
# 当客户端页面请求访问时执行get函数
def get(self):
return render_template('login.html')
# 当客户端向页面发送数据post请求时执行post函数
def post(self):
name = request.form.get('name')
password = request.form.get('password')
if name == 'dgw' and password == '666':
return '登录成功!'
else:
return '用户名或密码错误!'
# 类视图通过add_url_rule方法和url做映射, 并且在as_view方法中指定url的名称,方便url_for函数的调用
app.add_url_rule('/login/', view_func=LoginView.as_view('loginview'))
if __name__ == '__main__':
app.run()
运行效果: