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结合shell查询google关键词排名的实现代码
Feb 27 Python
win7上python2.7连接mysql数据库的方法
Jan 14 Python
Python读取Json字典写入Excel表格的方法
Jan 03 Python
Pyqt QImage 与 np array 转换方法
Jun 27 Python
django 配置阿里云OSS存储media文件的例子
Aug 20 Python
Python安装及Pycharm安装使用教程图解
Sep 20 Python
手机使用python操作图片文件(pydroid3)过程详解
Sep 25 Python
python turtle工具绘制四叶草的实例分享
Feb 14 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
May 07 Python
Django集成MongoDB实现过程解析
Dec 01 Python
python中函数返回多个结果的实例方法
Dec 16 Python
Python 发送SMTP邮件的简单教程
Jun 24 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
NO3第三帝国留言簿制作过程
2006/10/09 PHP
php获取文件名称和扩展名的方法
2017/02/07 PHP
php自定义函数实现统计中文字符串长度的方法小结
2017/04/15 PHP
javascript实现的使用方向键控制光标在table单元格中切换
2010/11/17 Javascript
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
JS定义回车事件(实现代码)
2013/07/08 Javascript
JS判断页面是否出现滚动条的方法
2015/07/17 Javascript
基于AngularJS实现页面滚动到底自动加载数据的功能
2015/10/16 Javascript
Jquery使用小技巧汇总
2015/12/29 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
js简单获取表单中单选按钮值的方法
2016/08/23 Javascript
JS实现的tab切换选项卡效果示例
2017/02/28 Javascript
解决vue-cli中stylus无法使用的问题方法
2017/06/19 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
2018/01/26 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
p5.js入门教程之图片加载
2018/03/20 Javascript
关于vue-router的那些事儿
2018/05/23 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
vue路由对不同界面进行传参及跳转的总结
2019/04/20 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
2019/06/04 jQuery
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python的Django框架中的数据过滤功能
2015/07/17 Python
python爬取淘宝商品详情页数据
2018/02/23 Python
Python计算不规则图形面积算法实现解析
2019/11/22 Python
Python基础之变量基本用法与进阶详解
2020/01/03 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
2020/12/03 Python
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
开学寄语大全
2014/04/08 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
实习指导教师评语
2014/12/30 职场文书
html输入两个数实现加减乘除功能
2021/07/01 HTML / CSS
JavaScript分页组件使用方法详解
2021/07/26 Javascript
Redis 限流器
2022/05/15 Redis
Redis全局ID生成器的实现
2022/06/05 Redis