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命令行参数sys.argv使用示例
Jan 28 Python
python使用在线API查询IP对应的地理位置信息实例
Jun 01 Python
Python 中 list 的各项操作技巧
Apr 13 Python
Python基于Socket实现的简单聊天程序示例
Aug 05 Python
Python+OpenCV让电脑帮你玩微信跳一跳
Jan 04 Python
python人民币小写转大写辅助工具
Jun 20 Python
详解重置Django migration的常见方式
Feb 15 Python
详解【python】str与json类型转换
Apr 29 Python
Django Admin中增加导出CSV功能过程解析
Sep 04 Python
Django使用消息提示简单的弹出个对话框实例
Nov 15 Python
python通用读取vcf文件的类(复制粘贴即可用)
Feb 29 Python
python 下载文件的多种方法汇总
Nov 17 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
Drupal7 form表单二次开发要点与实例
2014/03/02 PHP
制作安全性高的PHP网站的几个实用要点
2014/12/30 PHP
Laravel 5框架学习之用户认证
2015/04/09 PHP
php输出含有“#”字符串的方法
2017/01/18 PHP
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
JS保存、读取、换行、转Json报错处理方法
2013/06/14 Javascript
jQuery实现给页面换肤的方法
2015/05/30 Javascript
jquery获取当前元素索引值用法实例
2015/06/10 Javascript
window.onload使用指南
2015/09/13 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
基于Turn.js 实现翻书效果实例解析
2016/06/20 Javascript
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
2017/08/18 jQuery
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
layer弹出层自适应高度,垂直水平居中的实现
2019/09/16 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
2020/08/24 Javascript
Python 字符串操作实现代码(截取/替换/查找/分割)
2013/06/08 Python
Python selenium实现微博自动登录的示例代码
2018/05/16 Python
Python实现朴素贝叶斯分类器的方法详解
2018/07/04 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
2018/12/19 Python
Python捕获异常堆栈信息的几种方法(小结)
2020/05/18 Python
python mysql中in参数化说明
2020/06/05 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
西班牙鞋子和箱包在线销售网站:zapatos.es
2020/02/17 全球购物
类的核心特性有哪些
2014/01/01 面试题
大学生求职计划书
2014/04/30 职场文书
《陈毅探母》教学反思
2014/05/01 职场文书
会计求职信范文
2014/05/24 职场文书
毕业实习自我鉴定范文2014
2014/09/26 职场文书
欠条样本
2015/07/03 职场文书
《倍数和因数》教学反思
2016/02/23 职场文书
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL
JavaScript 对象创建的3种方法
2021/11/17 Javascript