ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Flask 给视图函数增加装饰器

2022-08-07 18:00:08  阅读:209  来源: 互联网

标签:__ return name get Flask app 视图 inner 装饰


Flask 给视图函数增加装饰器

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

 from flask import Flask,request,render_template,redirect,session,url_for,views
 from flask import render_template
 
 app = 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的name
 def 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')
 @wapper
 def detail(nid):
     print(nid)
     return render_template('hello.html')
 '''
 如果给一个视图函数增加装饰器,应该加在app.route下面,这样的效果就是,
 装饰器将下面的所有内容包裹,然后路由对应到这大的包裹中来。
 需要注意endpoint要注明,如果不注明endpoint则默认用函数名来定义,
 此时所有的函数名都叫inner了,所以需要注明endpoint,只是为了区分。
 '''
 
 if __name__ == '__main__':
     app.run()
另一种写法:

 import functools
 def 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_-
 其函数的名字得以保留。
 '''
 
 @wapper
 def detail():
     pass
 
 print(detail.__name__)
flask的get_flashed_messages,flash

 from flask import Flask,get_flashed_messages,flash
 app = 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()
flash还可以通过category参数给Flash内容归类,通过不同类别取不同内容。

标签:__,return,name,get,Flask,app,视图,inner,装饰
来源: https://www.cnblogs.com/chunyouqudongwuyuan/p/16559528.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有