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输出一个杨辉三角的例子
Jun 13 Python
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
Apr 24 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
Mar 14 Python
python爬虫入门教程--优雅的HTTP库requests(二)
May 25 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
Django实战之用户认证(初始配置)
Jul 16 Python
python爬虫框架scrapy实现模拟登录操作示例
Aug 02 Python
python 处理string到hex脚本的方法
Oct 26 Python
python批量爬取下载抖音视频
Jun 17 Python
pandas数据拼接的实现示例
Apr 16 Python
pyCharm 实现关闭代码检查
Jun 09 Python
python3 循环读取excel文件并写入json操作
Jul 14 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
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
php数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
php设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
计算php页面运行时间的函数介绍
2013/07/01 PHP
php静态文件生成类实例分析
2015/01/03 PHP
php使用pear_smtp发送邮件
2016/04/15 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
JQuery的ajax基础上的超强GridView展示
2009/09/18 Javascript
Jquery replace 字符替换实现代码
2010/12/02 Javascript
当前页禁止复制粘贴截屏代码小集
2013/07/24 Javascript
jQuery 回调函数(callback)的使用和基础
2015/02/26 Javascript
浅谈javascript中call()、apply()、bind()的用法
2015/04/20 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
js实现4个方向滚动的球
2017/03/06 Javascript
详解JavaScript对象的深浅复制
2017/03/30 Javascript
angularjs实现简单的购物车功能
2017/09/21 Javascript
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
微信小程序之事件交互操作实例分析
2018/12/03 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
NodeJS有难度的面试题(能答对几个)
2019/10/09 NodeJs
JavaScript 如何计算文本的行数的实现
2020/09/14 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
[08:29]DOTA2每周TOP10 精彩击杀集锦vol.7
2014/06/25 DOTA
Python tkinter事件高级用法实例
2018/01/31 Python
python实现最小二乘法线性拟合
2019/07/19 Python
使用django和vue进行数据交互的方法步骤
2019/11/11 Python
Pycharm如何运行.py文件的方法步骤
2020/03/03 Python
Nordgreen手表德国官方网站:丹麦极简主义手表
2019/10/31 全球购物
销售高级职员求职信
2013/10/29 职场文书
财会专业毕业生自荐信
2014/07/09 职场文书
2014年物流工作总结
2014/11/25 职场文书
青年文明号申报材料
2014/12/23 职场文书
2015年大学班主任工作总结
2015/04/30 职场文书
贫困生证明范文
2015/06/16 职场文书
Redis Cluster集群动态扩容的实现
2021/07/15 Redis