装饰器实现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

def wrapper2(func): # func == inner1
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()

猜你喜欢

转载自www.cnblogs.com/zzw731862651/p/9594866.html
今日推荐