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 ZipFile模块详解
Nov 01 Python
Python中List.index()方法的使用教程
May 20 Python
Python反射用法实例简析
Dec 22 Python
python互斥锁、加锁、同步机制、异步通信知识总结
Feb 11 Python
python贪婪匹配以及多行匹配的实例讲解
Apr 19 Python
用TensorFlow实现戴明回归算法的示例
May 02 Python
python实时监控cpu小工具
Jun 21 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
Jul 01 Python
python实现多进程按序号批量修改文件名的方法示例
Dec 30 Python
Python如何批量获取文件夹的大小并保存
Mar 31 Python
浅谈django不使用restframework自定义接口与使用的区别
Jul 15 Python
python如何获得list或numpy数组中最大元素对应的索引
Nov 16 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
php三维数组去重(示例代码)
2013/11/26 PHP
php实现curl模拟ftp上传的方法
2015/07/29 PHP
PHP中的浅复制与深复制的实例详解
2017/10/26 PHP
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
通过实例解析PHP数据类型转换方法
2020/07/11 PHP
由JavaScript中call()方法引发的对面向对象继承机制call的思考
2011/09/12 Javascript
js判断生效时间不得大于失效时间的思路及代码
2013/04/23 Javascript
JavaScript Array对象扩展indexOf()方法
2014/05/09 Javascript
java和javascript获取word文档的书签位置对比
2014/06/19 Javascript
使用jquery prev()方法找到同级的前一个元素
2014/07/11 Javascript
IE中getElementsByName()对有些元素无效的解决方案
2014/09/28 Javascript
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
javascript电商网站抢购倒计时效果实现
2015/11/19 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
jquery checkbox的相关操作总结
2016/10/17 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
详解项目升级到vue-cli3的正确姿势
2019/01/28 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
python使用wmi模块获取windows下硬盘信息的方法
2015/05/15 Python
Python Matplotlib库入门指南
2015/05/18 Python
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
python实现图片识别汽车功能
2018/11/30 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
解决Python import .pyd 可能遇到路径的问题
2021/03/04 Python
考博专家推荐信模板
2013/12/02 职场文书
数控专业毕业生自荐信范文
2014/03/04 职场文书
梅花魂教学反思
2014/04/25 职场文书
公民代理授权委托书
2014/09/24 职场文书
挂职个人工作总结
2015/03/05 职场文书
工作违纪的检讨书范文
2019/07/09 职场文书
六种css3实现的边框过渡效果
2021/04/22 HTML / CSS
python spilt()分隔字符串的实现示例
2021/05/21 Python
python 爬取京东指定商品评论并进行情感分析
2021/05/27 Python
MybatisPlus代码生成器的使用方法详解
2021/06/13 Java/Android
动态规划之使用备忘录来改进Javascript函数
2022/04/07 Javascript