16、类视图和URL的绑定
之前我们接触的视图都是函数,所以一般简称为视图函数。其实视图函数也可以基于类来实现,类视图的好处是支持继承,编写完类视图需要通过app.add_url_rule(url_rule,view_func)
来进行注册。Flask类视图一般分为标准类视图和基于调度方法的类视图。
标准类视图
-
定义首页模板
index.html
{# 首页 #} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Title</title> </head> <body> 这是首页!{{ ads }} </body> </html>
-
定义登录页模板
login.html
{# 登录页 #} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Title</title> </head> <body> 这是登录页面!{{ ads }} </body> </html>
-
定义注册页模板
register.html
{# 注册页 #} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Title</title> </head> <body> 这是注册页面!!{{ ads }} </body> </html>
-
定义主程序
from flask import Flask,render_template,views app = Flask(__name__) # 定义视图类 Ads class Ads(views.View): def __init__(self): # 实例化 super().__init__() # 继承自__init__()方法 # 添加类中内容 self.context = { 'ads': '这是对联广告!' } # 定义类 Index,继承自Ads class Index(Ads): def dispatch_request(self): # 定义类视图 return render_template('index.html', **self.context) # 定义类 Login,继承自Ads class Login(Ads): def dispatch_request(self): # 渲染模板 return render_template('login.html', **self.context) # 定义类 Register,继承自Ads class Register(Ads): def dispatch_request(self): return render_template('register.html', **self.context) # URL 与视图函数绑定 app.add_url_rule(rule='/', endpoint='index', view_func=Index.as_view('Index')) app.add_url_rule(rule='/login/', endpoint='login', view_func=Login.as_view('login')) app.add_url_rule(rule='/register/', endpoint='register', view_func=Register.as_view('register')) if __name__ == '__main__': app.run(debug=True)
基于方法的类视图
-
定义模板文件
login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <!--设定网页编码--> <title>Title</title> <!--设定网页标题--> <style type="text/css"> .div1 { height: 180px; width: 380px; border: 1px solid #8a8989; margin: 0 auto; } .input { display: block; width: 350px; height: 40px; margin: 10px auto; } .button { background: #2066c5; color: white; font-size: 18px; font-weight: bold; height: 50px; border-radius: 4px; } </style> </head> <body> <div class="div1"> <form action="login" method="post"> <!-- 表单提交到 login页面 -->> <!--表单开始--> <input type="text" class="input" name="username" placeholder="请输入用户名" /> <input type="password" class="input" name="pwd" placeholder="请输入密码" /> <input type="submit" value="登录" class="input button" /><!--定义登录submit--> </form> </div> <!--表单定义完毕--> </body> </html>
-
定义主程序
#encoding:utf-8 from flask import Flask,render_template,request,views #导入相应模块 app = Flask(__name__) #Flask初始化 # 登录主页 @app.route('/') #定义路由 def hello_world(): #定义视图函数 return render_template('index.html') #渲染模板 #定义LoginView类 class LoginView(views.MethodView): # 当用户通过get方法进行访问的时候执行get方法,即跳转到主页 def get(self): #定义get函数 return render_template("index.html") #渲染模板 # 当用户通过post方法进行访问的时候执行post方法。验证表单,继续在 login页面渲染 def post(self): #定义post 函数 username = request.form.get("username") #接收表单中传递过来的用户名 password = request.form.get("pwd") #接收表单中传递过来的密码 if username == 'admin' and password == 'admin': #判断用户名和密码是否为admin return "用户名正确,可以登录!" #if语句为真的话,返回可以登录信息 else: return "用户名或密码错误,不可以登录!" #否则,返回不可以登录信息 # 登录结果页。通过add_url_rule添加类视图和/login的映射关系 app.add_url_rule('/login',view_func=LoginView.as_view('loginview')) if __name__ == '__main__': #当模块被直接运行时,代码将被运行,当模块是被导入时,代码不被执行 app.run(debug=True) #开启调试模式