一、before_request装饰器和after_request装饰器
我们现在有一个Flask程序其中有3个路由和视图函数
from flask import Flask app = Flask(__name__) # type:Flask @app.route("/login") def login(): return "Login" @app.route("/index") def index(): return "Index" @app.route("/home") def home(): return "home" app.run("0.0.0.0", 5000)
如果我们需要让用户登录才可以看到index和home怎么办就需要认证下也就用到了session,查看session中有没有数据就可以了所以我们就要在请求index页面和home页面之前判定是否登陆了
1.@app.before_request在请求进入视图函数之前执行
from flask import Flask from flask import request from flask import redirect from flask import session app = Flask(__name__) # type:Flask app.secret_key = "DragonFire" @app.before_request def is_login(): if request.path == "/login": return None if not session.get("user"): return redirect("/login") @app.route("/login") def login(): return "Login" @app.route("/index") def index(): return "Index" @app.route("/home") def home(): return "Login"
@app.before_request就是这样一个装饰器,他所装饰的函数,都会在请求进入视图函数之前执行
2.after_request在响应返回客户端之前执行,结束视图函数之后
@app.after_request def foot_log(environ): if request.path != "/login": print("有客人访问了",request.path) return environ
二、Flask中的另一种添加设置访问路径的方法以及Flask中的CBV
app.add_url_rule("/路径名",view_func=类名.as_view(name="login"))
1.Flask中的CBV
比如我们设置一个登陆
from flask import views class Login(views.MethodView): methods = ["GET","POST"] def get(self): returen "这是get请求返回" def post(self): print("这是post提交") app.add_url_rule("/login",view_func=Login.as_view(name="login"))
三、WTForms三方组件小插件
我们先要安装WTForms组件,安装方法类似于Flask
比如我们用WTForms返回一个登陆页面带验证的那种我们应该怎么写呢??
1.新建一个py文件用来写我们要返回的登陆页面的内容
app01.py文件内容
from wtforms import Form,validators from flask import Flask app = Flask(__name__) class Loginform(Form): username = simple.StringField( label="用户名", validators=[ validators.DataRequired(message="用户名不能为空"), validators.length(max=10,message="用户名长度不能超过10") ] ) password = simple.PasswordField( label="密码", validators=[ validators.DataRequired(message="密码不能为空"), validators.length(min=6,message="密码长度不能小于%(min)s"), validators.length(max=10,message="密码长度不能大于%(max)s") ] ) button = simple.SubmitField( label="登陆" ) class Login(views.MethodView): methods = ["GET","POST"] def get(self): login_form = Loginform() return render_template("login.html",loginform = login_form)
#把login_form类丢给前端文件 def post(self): login_form_data = Loginform(request.form)print(request.form.get("username")) print(request.form.get("password"))return "登陆成功" if __name__ == '__main__': app.run(debug=True)
2.我们的前端文件html
login.html 文件中的内容
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --> <title>Bootstrap 101 Template</title> <!-- Bootstrap --> </head> <body> <form action="" method="post" novalidate> <p> {{ loginform.username.label }} {{ loginform.username }} {{ loginform.username.errors.0 }} </p> <p> {{ loginform.password.label }} {{ loginform.password }} {{ loginform.password.errors.0 }} </p> {{ loginform.button }} </form> </body> </html>