Flask 给视图函数增加装饰器

在@app.route的情况下增加装饰器的写法:

 1 from flask import Flask,request,render_template,redirect,session,url_for,views
 2 from flask import render_template
 3
 4 app = Flask(__name__) #实例化flask对象
 5 app.debug = True   #能够随时更改自动重启,不加的话每次更改代码需要手动重启
 6 app.config[‘SECRET_KEY‘] = ‘123456‘   #secret_key,用于给session加密
 7
 8
 9
10 @app.route(‘/login‘,methods=[‘GET‘,‘POST‘],endpoint=‘t1‘) #endpoint是url的别名,相当于django中Url的name
11 def login():
12     if request.method == "GET":
13         # res = request.query_string
14         # print(res)  获取通过GET请求url传过来的参数
15         return render_template(‘login.html‘)
16     else:
17         user = request.form.get(‘user‘)
18         pwd = request.form.get(‘pwd‘)
19         if user == ‘tom‘ and pwd == ‘123‘:
20             session[‘userinfo‘] = user   #设置session
21             return render_template(‘hello.html‘)
22         return render_template(‘login.html‘, error=‘用户名或密码错误‘)
23
24 def wapper(func):
25     def inner(*args,**kwargs):
26         user = session.get(‘user_info‘)
27         if not user:
28             return redirect(‘/login‘)
29         return func(*args,**kwargs)
30     return inner
31
32
33 @app.route(‘/detail/<int:nid>‘,methods=[‘GET‘],endpoint=‘n1‘)
34 @wapper
35 def detail(nid):
36     print(nid)
37     return render_template(‘hello.html‘)
38 ‘‘‘
39 如果给一个视图函数增加装饰器,应该加在app.route下面,这样的效果就是,
40 装饰器将下面的所有内容包裹,然后路由对应到这大的包裹中来。
41 需要注意endpoint要注明,如果不注明endpoint则默认用函数名来定义,
42 此时所有的函数名都叫inner了,所以需要注明endpoint,只是为了区分。
43 ‘‘‘
44
45 if __name__ == ‘__main__‘:
46     app.run()

另一种写法:

 1 import functools
 2 def wapper(func):
 3     @functools.wraps(func)
 4     def inner(*args,**kwargs):
 5         return func(*args,**kwargs)
 6     return inner
 7 ‘‘‘
 8 functools.wraps()相当于保留元信息
 9 说白了就是,如果不加这个装饰器,那么你打印detail的__name__它就是inner了,
10 因为加了装饰器,效果等同于inner=inner(detail()),
11 如果在装饰器中加了functools这个装饰器,那么相当于给__name__重新赋值,inner.__name__ = func.__name_-
12 其函数的名字得以保留。
13 ‘‘‘
14
15 @wapper
16 def detail():
17     pass
18
19 print(detail.__name__)

flask的get_flashed_messages,flash

 1 from flask import Flask,get_flashed_messages,flash
 2 app = Flask(__name__)
 3 app.secret_key = ‘asdf‘
 4 @app.route(‘/get‘)
 5 def get():
 6     data = get_flashed_messages()
 7     print(data)
 8     return ‘Hello world‘
 9
10 @app.route(‘/set‘)
11 def set():
12     flash(‘info info‘)
13     ‘‘‘
14     闪现效果,相当于set视图函数执行2次,会在一个列表中存储两个flash函数的内容,
15     当执行get_flashed_messages的时候则会取出该列表,并清空,类似字典的Pop。
16     具体用处不大。。。
17     ‘‘‘
18     return ‘Hello world‘
19
20 if __name__ == ‘__main__‘:
21     app.run()

flash还可以通过category参数给Flash内容归类,通过不同类别取不同内容。

原文地址:https://www.cnblogs.com/ArmoredTitan/p/8870819.html

时间: 2024-08-06 15:08:33

Flask 给视图函数增加装饰器的相关文章

Django学习笔记第八篇--实战练习四--为你的视图函数自定义装饰器

零.背景: 对于登录后面所有视图函数,都需要验证登录信息,一般而言就是验证cookie里面的一些信息.所以你可以这么写函数: 1 def personinfo(request): 2 if request.COOKIES.get("login_flag") == "1": 3 return HttpResponse("Success!") 4 else: 5 return HttpResponse("Failed!") 这样就

二十五:视图之类视图中使用装饰器

对于url的保护,一般是通过装饰器实现,如:某个页面需要登录后才能访问 函数视图实现 from flask import Flask, render_template, requestfrom functools import wrapsapp = Flask(__name__)def login_required(func): @wraps(func) def wrapper(*args, **kwargs): username = request.args.get('username') r

python函数、装饰器、迭代器、生成器

5月21日,请假结婚,然后性格惰性来了,不怎么想看视频和笔记,性格中的弱点开始出现,开始做的不错,渐渐开始松懈,直至放弃--- 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象:  函数是第一类对象,即函数可以当作数据传递,它的应用形式也被称为高阶函数,函数的特性如下: a. 可以被引用 1 # def foo(): 2 # print('from foo') 3 # 4 # func = foo

函数3—装饰器

1 为什么要用装饰器 开放封闭原则 :游戏上线后,尽量避免更改源代码和调用方式,但是出于需求必须为代码增加扩展性 2 什么是装饰器: 本质是一种函数 ,没有改动函数源代码和调用方式的情况下,给函数增加一种新的功能 利用了闭包的原理,闭包的作用就是可以在外部调用这个内部闭包函数,不用关心作用域的问题 3 装饰器的作用原理:将被装饰函数放入装饰器函数内部的一个闭包函数内,再在外部调用闭包函数 函数嵌套------->闭包---------->装饰器 #无参装饰器(被装饰函数无参)import ti

函数和装饰器

函数定义空函数函数作用域块级作用域局部作用域作用域链终极版作用域函数参数定义:默认参数可变参数关键字参数组合参数小结高阶函数与函数返回值高阶函数函数返回值lambda与匿名函数mapfilterreducelambda小结装饰器格式装饰器原理带参数的装饰器装饰器应用装饰器小结开放封闭原则闭包概念闭包的作用 函数定义 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值

Python入门之函数的装饰器

本章目录: 装饰器: 一.为什么要用装饰器 二.什么是装饰器 三.无参装饰器 四.装饰器语法糖 五.认证装饰器实现 六.叠加多个装饰器 七.带参装饰器 =========================================================== 一.开放封闭原则 引子--为什么要用装饰器 软件一旦上线后,对修改源代码是封闭的,对功能扩展是开放的. 也就是说我们必须找到一种解决方案: 能够在不修改一个功能源代码以及调用方式的前提下,为其加上新功能 总结,原则如下: 1.不

CSIC_716_20191112【闭包函数和装饰器】

闭包函数 什么是闭包函数:闭包函数是函数嵌套.函数对象.名称空间和作用域的集合体. 闭包函数必须在函数内部定义,闭包函数可以引用外层函数的名字. # _*_ coding: gbk _*_ # @Author: Wonder def outer(): def inner(): #代码体 return inner() outer() # 调用闭包函数 装饰器 什么是装饰器:装饰器本身是一个函数,是在不修改其他函数源代码以及调用方式的前提下,给其他函数增加功能的函数. 装饰器遵循开放闭合原则.即对函

闭包函数、装饰器以及语法糖

闭包函数: 1.闭包函数必须在函数内部定义 2.闭包函数可以引用外层函数的名字 闭包函数是 函数嵌套.函数对象.名称空间与作用域 结合体. # 直接传参 def func(x): print(x) func(1000) # 通过闭包函数传参 def outer(number): # number = 100 # inner就是闭包函数 def inner(): print(number) return inner func = outer(1000) # ---> inner地址 ---> f

python day4笔记 常用内置函数与装饰器

1.常用的python函数 abs             求绝对值 all               判断迭代器中所有的数据是否为真或者可迭代数据为空,返回真,否则返回假 any             判断迭代器中的数据是否有一个为真,有返回真,可迭代数据为空或者没有真,返回假 bin             转换整数为二进制字符串 hex            转换整数为十六进制字符串 oct             转换整数为八进制字符串 bool           转换数据为布尔值