Flask中的before_request装饰器和after_request装饰器以及WTForms组件

一、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页面之前判定是否登陆了

  [email protected]_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>

猜你喜欢

转载自www.cnblogs.com/guchenxu/p/10706670.html
今日推荐