类视图
类视图和视图函数的区别在于,类视图可以继承,但类视图写完之后需要进行注册。
标准类视图
- 标准类视图继承自flask.views.View
- 标准类视图的注册:app.add_url_rule(rule,endpoint,view_func)
-标准类视图必须重写dispatch_request方法 ,不然会报错,返回NotImplementError类型错误
app.add_url_rule()
三个常用的参数:
- rule:路由地址(访问时用)
- endpoint:使用url_for()函数获取路由时的第一个参数,也可以不指定
- view_func:函数名称(不需加括号)
标准类视图的使用
from flask import Flask,render_template,views,url_for,redirect
app = Flask(__name__)
@app.route('/')
def HomePage():
return 'Welcome to my HomePage~'
# @app.route('/Dict/')
# def Dict():
# return redirect(url_for('List'))
# @app.route('/index.html/')
# def index():
# return render_template('html/index.html')
class DictView(views.View):
def dispatch_request(self):
return redirect(url_for('List'))
class ListView(views.View):
def dispatch_request(self):
return render_template('html/index.html')
app.add_url_rule('/index.html/', view_func=ListView.as_view('List'))
app.add_url_rule('/Dict/', view_func=DictView.as_view('Dict'))
# View.as_view('名称'):指定视图的dispatch_request函数,名称自定义
# 如果ListView.as_view,就是指ListView标准类视图的dispatch_request函数
if __name__ == '__main__':
app.run(debug=True)
View.as_view(‘名称’):指定视图的dispatch_request函数,名称可以自定义。例如:如果是ListView.as_view,就是指ListView标准类视图的dispatch_request函数。
基于调度方法的类视图
flask还提供了另外一种类视图(flask.views.MethodView),对每个访问HTTP的方法执行不同的函数(映射到每个方法的同名小写方法上)
class LoginView(views.MethodView):
def get(self, name=None, error=None):
return render_template('html/login.html',name=name,error=error)
def post(self):
name = request.form.get('name')
password = request.form.get('password')
if name == 'Sleet' and password == '123456':
return self.get(name=name)
else:
return self.get(error='账号或者密码错误')
装饰器装饰类视图
1、创建一个类视图
def setting_decorate(func):
def wrapper(*args,**kwargs):
name = request.args.get('name')
if name:
return func(*args,**kwargs)
else:
return redirect(url_for('login'))
return wrapper
2、在类视图使用装饰器
在类视图定义一个属性:decorate = [装饰器名称]
每次调用该类视图,就会执行这个装饰器
class SettingView(views.View):
decorators = [setting_decorate]
def dispatch_request(self):
return '个人中心'