码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-09-05 23:51:21      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:gen   post   wrap   and   返回   添加   redirect   imp   inner   

一、装饰器实现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()

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

标签:gen   post   wrap   and   返回   添加   redirect   imp   inner   

原文地址:https://www.cnblogs.com/zzw731862651/p/9594866.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!