首页 > 编程 > Python > 正文

Flask框架实现给视图函数增加装饰器操作示例

2020-02-15 22:24:45
字体:
来源:转载
供稿:网友

本文实例讲述了Flask框架实现给视图函数增加装饰器操作。分享给大家供大家参考,具体如下:

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

from flask import Flask,request,render_template,redirect,session,url_for,viewsfrom flask import render_templateapp = Flask(__name__) #实例化flask对象app.debug = True  #能够随时更改自动重启,不加的话每次更改代码需要手动重启app.config['SECRET_KEY'] = '123456'  #secret_key,用于给session加密@app.route('/login',methods=['GET','POST'],endpoint='t1') #endpoint是url的别名,相当于django中Url的namedef login():  if request.method == "GET":    # res = request.query_string    # print(res) 获取通过GET请求url传过来的参数    return render_template('login.html')  else:    user = request.form.get('user')    pwd = request.form.get('pwd')    if user == 'tom' and pwd == '123':      session['userinfo'] = user  #设置session      return render_template('hello.html')    return render_template('login.html', error='用户名或密码错误')def wapper(func):  def inner(*args,**kwargs):    user = session.get('user_info')    if not user:      return redirect('/login')    return func(*args,**kwargs)  return inner@app.route('/detail/<int:nid>',methods=['GET'],endpoint='n1')@wapperdef detail(nid):  print(nid)  return render_template('hello.html')'''如果给一个视图函数增加装饰器,应该加在app.route下面,这样的效果就是,装饰器将下面的所有内容包裹,然后路由对应到这大的包裹中来。需要注意endpoint要注明,如果不注明endpoint则默认用函数名来定义,此时所有的函数名都叫inner了,所以需要注明endpoint,只是为了区分。'''if __name__ == '__main__':  app.run()

另一种写法:

import functoolsdef wapper(func):  @functools.wraps(func)  def inner(*args,**kwargs):    return func(*args,**kwargs)  return inner'''functools.wraps()相当于保留元信息说白了就是,如果不加这个装饰器,那么你打印detail的__name__它就是inner了,因为加了装饰器,效果等同于inner=inner(detail()),如果在装饰器中加了functools这个装饰器,那么相当于给__name__重新赋值,inner.__name__ = func.__name_-其函数的名字得以保留。'''@wapperdef detail():  passprint(detail.__name__)

flask的get_flashed_messages,flash

from flask import Flask,get_flashed_messages,flashapp = Flask(__name__)app.secret_key = 'asdf'@app.route('/get')def get():  data = get_flashed_messages()  print(data)  return 'Hello world'@app.route('/set')def set():  flash('info info')  '''  闪现效果,相当于set视图函数执行2次,会在一个列表中存储两个flash函数的内容,  当执行get_flashed_messages的时候则会取出该列表,并清空,类似字典的Pop。  具体用处不大。。。  '''  return 'Hello world'if __name__ == '__main__':  app.run()            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表