Flask 给视图函数增加装饰器

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

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

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