1、views.MethodView
flask提供的基于调度方法的视图,可以对每个HTTP请求方式执行不同的函数(映射到对应方法的小写的同名方法(post\get)上)
一个小例子:
from flask import Flask, views, render_template, request
app = Flask(__name__)
app.config["TEMPLATES_AUTO_RELOAD"] = True
# views.MethodView中不需要,像views.View中需要重写dispatch_request
class ModView(views.MethodView):
def get(self, arg=""):
return render_template("method.html", arg=arg)
def post(self):
name = request.form.get("name")
password = request.form.get("password")
# 在实际开发中此时应当查询数据库
if name == "liu" or password == "123":
# return self.get()
return "登录成功"
else:
return self.get(arg="账户密码错误")
app.add_url_rule("/", view_func=ModView.as_view("home"))
if __name__ == "__main__":
app.run(debug=True)
method.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>method</title>
</head>
<body>
{% macro input(name, value="", type="text") %}
<input name="{{ name }}", value="{{ value }}", type="{{ type }}">
{% endmacro %}
<table>
<tr>
<td>用户名:</td>
<td>{{ input('username') }}</td>
</tr>
<tr>
<td>密码:</td>
<td>{{ input('password', type="password") }}</td>
</tr>
<tr>
<td>确定:</td>
<td>{{ input(value="登录", type="submit") }}</td>
</tr>
</table>
<p>{{ arg }}</p>
</body>
</html>
2、使用装饰器装饰类视图
类视图有一个缺陷就是比较难用装饰器进行装饰
1、一个小例子:视图函数的装饰器
完成功能,如果用户没有输入用户名,那么就进入要进行登录,如果写了用户名,就进入个人中心
from flask import Flask, request, redirect, url_for
app = Flask(__name__)
app.config["EMPLATES_AUTO_RELOAD"] = True
def decorate(func):
def make(*args, **kwargs):
username = request.args.get("username")
if username:
return func(*args, **kwargs)
else:
return redirect(url_for("logic"))
return make
@app.route("/")
@decorate
def home():
return "个人中心"
@app.route("/logic/")
def logic():
return "请先登录"
if __name__ == "__main__":
app.run(debug=True)
页面显示:输入http://127.0.0.1:5000/?username=123
页面显示:输入http://127.0.0.1:5000/
2、在类视图中完成相同操作
代码部分:
from flask import Flask, request, redirect, url_for, views
app = Flask(__name__)
app.config["EMPLATES_AUTO_RELOAD"] = True
def decorate(func):
def make(*args, **kwargs):
username = request.args.get("username")
if username:
return func(*args, **kwargs)
else:
return redirect(url_for("logic"))
return make
class Home(views.View):
# 类的装饰器需要通过decorators进行接收,可以写多个装饰器,写在列表中即可
# 写入装饰器名称,不需要写@符
decorators = [decorate]
def dispatch_request(self):
return "个人中心"
@app.route("/logic/")
def logic():
return "请先登录"
app.add_url_rule('/', view_func=Home.as_view("home"))
if __name__ == "__main__":
app.run(debug=True)
注意点: