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


Posted in Python onJuly 16, 2018

本文实例讲述了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内容归类,通过不同类别取不同内容。

更多关于Python相关内容可查看本站专题:《Python入门与进阶经典教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python正则获取、过滤或者替换HTML标签的方法
Jan 28 Python
实例解析Python设计模式编程之桥接模式的运用
Mar 02 Python
python实现中文转换url编码的方法
Jun 14 Python
python的dataframe转换为多维矩阵的方法
Apr 11 Python
python实现播放音频和录音功能示例代码
Dec 30 Python
python3 打印输出字典中特定的某个key的方法示例
Jul 06 Python
Python timer定时器两种常用方法解析
Jan 20 Python
pytorch torchvision.ImageFolder的用法介绍
Feb 20 Python
Python小整数对象池和字符串intern实例解析
Mar 21 Python
Python语法垃圾回收机制原理解析
Mar 25 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
Apr 12 Python
利用Python读取微信朋友圈的多种方法总结
Aug 23 Python
flask框架使用orm连接数据库的方法示例
Jul 16 #Python
flask框架实现连接sqlite3数据库的方法分析
Jul 16 #Python
Sanic框架异常处理与中间件操作实例分析
Jul 16 #Python
对pycharm代码整体左移和右移缩进快捷键的介绍
Jul 16 #Python
对Python3.6 IDLE常用快捷键介绍
Jul 16 #Python
Sanic框架请求与响应实例分析
Jul 16 #Python
解决Python 中英文混输格式对齐的问题
Jul 16 #Python
You might like
关于我转生变成史莱姆这档事:第二季PV上线,萌王2021年回归
2020/05/06 日漫
德生BCL3000的电路分析和打磨
2021/03/02 无线电
php设计模式 Prototype (原型模式)代码
2011/06/26 PHP
通过table标签,PHP输出EXCEL的实现方法
2013/07/24 PHP
PHP代码优化之成员变量获取速度对比
2014/02/28 PHP
浅析php中json_encode()和json_decode()
2014/05/25 PHP
对象特征检测法判断浏览器对javascript对象的支持
2009/07/25 Javascript
jQuery温习篇 强大的JQuery选择器
2010/04/24 Javascript
JavaScript插入动态样式实现代码
2012/02/22 Javascript
javascript SpiderMonkey中的函数序列化如何进行
2012/12/05 Javascript
JavaScript作用域与作用域链深入解析
2013/12/06 Javascript
关闭ie窗口清除Session的解决方法
2014/01/10 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
教你快速搭建Node.Js服务器的方法教程
2017/03/30 Javascript
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
vue组件中watch props根据v-if动态判断并挂载DOM的问题
2019/05/12 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
vue router返回到指定的路由的场景分析
2020/11/10 Javascript
简单讲解Python中的闭包
2015/08/11 Python
利用numpy+matplotlib绘图的基本操作教程
2017/05/03 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
用python解压分析jar包实例
2020/01/16 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
matplotlib jupyter notebook 图像可视化 plt show操作
2020/04/24 Python
加拿大租车网站:Enterprise Rent-A-Car
2018/07/26 全球购物
Bibloo匈牙利:女装、男装、童装及鞋子和配饰
2019/04/14 全球购物
高二地理教学反思
2014/01/24 职场文书
五年后的职业生涯规划
2014/03/04 职场文书
市政管理求职信范文
2014/05/07 职场文书
实习指导教师评语
2014/12/30 职场文书
中学社团活动总结
2015/05/07 职场文书
责任书范本大全
2015/05/11 职场文书
数学复习课教学反思
2016/02/18 职场文书
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏