• 装饰器实现flask登录,没登录不让看index页面,多个装饰器装饰一个函数的执行顺序


    一、装饰器实现flask登录,没登录不让看index页面
    from flask import Flask, render_template, request, redirect, Markup, session

    # PEP8
    app = Flask(__name__) # 实例化flask对象
    app.secret_key = "123asdzxc" #这个必须写,不然没有session

    STUDENT_DICT = {
    1: {'name': 'Old', 'age': 38, 'gender': '中'},
    2: {'name': 'Boy', 'age': 73, 'gender': '男'},
    3: {'name': 'EDU', 'age': 84, 'gender': '女'},
    }

    def wai(func):
    def inner(*args,**kwargs):
    if not session.get("user"):
    return redirect("/login")

    else:
    return func(*args,**kwargs)
    return inner


    @app.template_global()
    def a_b(a, b):
    return a * b


    @app.template_filter()
    def a_b_c(a, b, c):
    return a * b * c


    @app.route("/index")
    @wai
    def index():
    btn = "<a href='/add_stu'>添加学生</a>"
    btn = Markup(btn)
    return render_template("index.html", stu=STUDENT_DICT, btn=btn)


    @app.route("/login", methods=["POST", "GET"])
    def login():
    print(request.method) # 获得当前请求的方式
    if request.method == "GET":
    # print(request.args["id"]) # 获取GET请求时,URL参数
    # print(request.args.get("username")) # 获取GET请求时,URL参数
    return render_template("login.html")

    if request.method == "POST":
    username = request.form["username"] # 获取POST请求时,FormData中的参数
    password = request.form.get("password")
    if username == "alex" and password == "DSB":
    session["user"] = username
    return redirect("/index")
    else:
    return render_template("login.html", msg="用户名密码错")

    # print(request.values.to_dict()) # 坑FormData参数会被URL参数覆盖
    print(request.data) # Content-Type: None
    print(request.json) # Content-Type: application/json
    print(request.headers) # 请求头
    print(request.url) # url地址:http://127.0.0.1:9527/login?id=123&username=dsb
    print(request.path) # /login
    print('6666')

    return render_template("login.html")


    @app.route("/detail")
    def detail():
    if request.method == "GET":
    id = request.args["id"]
    stu = STUDENT_DICT.get(int(id))
    return render_template("detail.html", stu=stu, id=id)


    @app.route("/delete/<int:id>")
    def delete(id):
    print(type(id), id)
    STUDENT_DICT.pop(id)

    return redirect("/index")


    @app.route("/inc")
    def inc():
    return render_template("inc.html", stu=STUDENT_DICT)


    if __name__ == '__main__':
    app.run("0.0.0.0", 9527, debug=True)

    二、多个装饰器装饰一个函数的执行顺序(day12):
    def wrapper1(func):  # func ==  f函数名    #哪个糖靠近被装饰函数,哪个语法糖函数就先执行,但是内部的inner却后执行
    print('进入wrapper1了')
    def inner1():
    print('inner1') # 2
    func() #这个函数func是被装饰的函数
    print('func1') # 4
    return inner1 #@wrapper1最后一句f==inner1和@wrapper2后第一句f=wrapper2(f),变量替换,inner1 = wrapper2(f),这样就执行下面的装饰器函数了

    def wrapper2(func): # func == inner1 上面返回一个inner1 = wrapper2(f)
    print('进入wrapper2了')
    def inner2():
    print('inner2') # 1
    func() #这里的func()其实是inner1(),到上面去了
    print('func2') # 5
    return inner2
    # @wrapper3
    @wrapper2 # f = wrapper2(f) 里面的f==inner1 外面的f == inner2
    @wrapper1 # f = wrapper1(f) 里面的f==函数名f 外面的f == inner1
    def f(): # 3
    print('主函数')

    f() # inner2()
  • 相关阅读:
    旷视科技python开发,python数据清理和数据清洗面试题【杭州多测师_王sir】【杭州多测师】
    App三种启动场景:冷启动、热启动、温启动【杭州多测师_王sir】【杭州多测师】
    adb常用的命令【杭州多测师_王sir】【杭州多测师】
    采购预付F48
    做题开悟
    发票自动结算
    SAP 评估收货结算(ERS)
    R语言用贝叶斯线性回归、贝叶斯模型平均 (BMA)来预测工人工资|附代码数据
    R语言文本挖掘NASA数据网络分析,tfidf和主题建模|附代码数据
    【视频】文本挖掘:主题模型(LDA)及R语言实现分析游记数据|附代码数据
  • 原文地址:https://www.cnblogs.com/zzw731862651/p/9594866.html
Copyright © 2020-2023  润新知