1、views.MethodView
flask提供的基于调度方法的视图,可以对每个HTTP请求方式执行不同的函数(映射到对应方法的小写的同名方法(post\get)上)
一个小例子:
from flask import Flask, views, render_template, requestapp = Flask(__name__)app.config["TEMPLATES_AUTO_RELOAD"] = True# views.MethodView中不需要,像views.View中需要重写dispatch_requestclass 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_forapp = Flask(__name__)app.config["EMPLATES_AUTO_RELOAD"] = Truedef 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("/")@decoratedef 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, viewsapp = Flask(__name__)app.config["EMPLATES_AUTO_RELOAD"] = Truedef decorate(func):def make(*args, **kwargs):username = request.args.get("username")if username:return func(*args, **kwargs)else:return redirect(url_for("logic"))return makeclass 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)
注意点:
