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的shutil模块中文件的复制操作函数详解
Jul 05 Python
用python处理图片实现图像中的像素访问
May 04 Python
python 自定义装饰器实例详解
Jul 20 Python
快速解决vue.js 模板和jinja 模板冲突的问题
Jul 26 Python
Python csv文件的读写操作实例详解
Nov 19 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
Jan 08 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
Jan 08 Python
树莓派升级python的具体步骤
Jul 05 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
Aug 18 Python
Python unittest装饰器实现原理及代码
Sep 08 Python
django学习之ajax post传参的2种格式实例
May 14 Python
Python 读写 Matlab Mat 格式数据的操作
May 19 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
ecshop 订单确认中显示省市地址信息的方法
2010/03/15 PHP
使用php记录用户通过搜索引擎进网站的关键词
2014/02/13 PHP
php使用反射插入对象示例分享
2014/03/11 PHP
php中final关键字用法分析
2016/12/07 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
php实现构建排除当前元素的乘积数组方法
2018/10/06 PHP
PHP保存Base64图片base64_decode的问题整理
2019/11/04 PHP
javascript两段代码,两个小技巧
2010/02/04 Javascript
javascript 随机展示头像实现代码
2011/12/06 Javascript
JS获取文件大小方法小结
2015/12/08 Javascript
JavaScript File API实现文件上传预览
2016/02/02 Javascript
深入剖析JavaScript:Object类型
2016/05/10 Javascript
jQuery实现动态文字搜索功能
2017/01/05 Javascript
Vue form 表单提交+ajax异步请求+分页效果
2017/04/22 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
Angular5中状态管理的实现
2018/09/03 Javascript
Angular PWA使用的Demo示例
2019/01/31 Javascript
详解nodejs 开发企业微信第三方应用入门教程
2019/03/12 NodeJs
Vue拖拽组件列表实现动态页面配置功能
2019/06/17 Javascript
Python脚本实现代码行数统计代码分享
2015/03/10 Python
Python装饰器使用实例:验证参数合法性
2015/06/24 Python
Python中Iterator迭代器的使用杂谈
2016/06/20 Python
Python闭包之返回函数的函数用法示例
2018/01/27 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
基于梯度爆炸的解决方法:clip gradient
2020/02/04 Python
Django models文件模型变更错误解决
2020/05/11 Python
奢华的意大利皮革手袋:Bene Handbags
2019/10/29 全球购物
不开辟用于交换数据的临时空间,如何完成字符串的逆序
2012/12/02 面试题
小学教师的个人自我鉴定
2013/10/24 职场文书
李敖北大演讲稿
2014/05/24 职场文书
大专毕业生求职信
2014/07/05 职场文书
综治维稳工作承诺书
2014/08/30 职场文书
十佳少年事迹材料
2014/12/25 职场文书
深入理解go slice结构
2021/09/15 Golang