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群发邮件实例代码
Jan 03 Python
python3.4下django集成使用xadmin后台的方法
Aug 15 Python
TensorFlow变量管理详解
Mar 10 Python
对Python捕获控制台输出流的方法详解
Jan 07 Python
python的set处理二维数组转一维数组的方法示例
May 31 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
Sep 17 Python
python设置代理和添加镜像源的方法
Feb 14 Python
Python argparse模块使用方法解析
Feb 20 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
Apr 14 Python
Django与数据库交互的实现
Jun 03 Python
Python写情书? 10行代码展示如何把情书写在她的照片里
Apr 21 Python
Python中的socket网络模块介绍
Jul 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
php面向对象 字段的声明与使用
2012/06/14 PHP
php防止伪造数据从地址栏URL提交的方法
2014/08/24 PHP
php中fsockopen用法实例
2015/01/05 PHP
浅谈json_encode用法
2015/03/05 PHP
Laravel实现定时任务的示例代码
2017/08/10 PHP
htm调用JS代码
2007/03/15 Javascript
jQuery EasyUI API 中文文档 - ProgressBar 进度条
2011/09/29 Javascript
css样式标签和js语法属性区别
2013/11/06 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
2015/09/28 Javascript
JavaScript获取IP获取的是IPV6 如何校验
2016/06/12 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
微信小程序实现YDUI的ScrollNav组件
2018/02/02 Javascript
vue iview组件表格 render函数的使用方法详解
2018/03/15 Javascript
Three.js实现简单3D房间布局
2018/12/30 Javascript
在 Vue 应用中使用 Netlify 表单功能的方法详解
2019/06/03 Javascript
Vue内部渲染视图的方法
2019/09/02 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
2018/04/17 Python
python 读取DICOM头文件的实例
2018/05/07 Python
python调用函数、类和文件操作简单实例总结
2019/11/29 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
将tf.batch_matmul替换成tf.matmul的实现
2020/06/18 Python
python 密码学示例——凯撒密码的实现
2020/09/21 Python
详解CSS3中使用gradient实现渐变效果的方法
2015/08/18 HTML / CSS
Zalando Lounge瑞士:时尚与生活方式购物俱乐部
2020/03/12 全球购物
SQL Server里面什么样的视图才能创建索引
2015/04/17 面试题
自动化工程专业个人应聘自荐信
2013/09/26 职场文书
2015年社会治安综合治理工作总结
2015/04/10 职场文书
毕业班班主任工作总结2015
2015/07/23 职场文书
高效课堂教学反思
2016/02/24 职场文书
JavaScript使用canvas绘制坐标和线
2021/04/28 Javascript
如何使用PyCharm及常用配置详解
2021/06/03 Python