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实现批量获取指定文件夹下的所有文件的厂商信息
Sep 28 Python
python中解析json格式文件的方法示例
May 03 Python
Python基于回溯法子集树模板实现8皇后问题
Sep 01 Python
python模块之time模块(实例讲解)
Sep 13 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
Dec 12 Python
python顺序执行多个py文件的方法
Jun 29 Python
python实现按首字母分类查找功能
Oct 31 Python
wxPython实现带颜色的进度条
Nov 19 Python
PyCharm 2019.3发布增加了新功能一览
Dec 08 Python
Python+OpenCV实现图像的全景拼接
Mar 05 Python
python中urllib.request和requests的使用及区别详解
May 05 Python
Django项目创建及管理实现流程详解
Oct 13 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在DOS命令行下却无法链接MySQL的技术笔记
2010/12/29 PHP
php XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
PHP延迟静态绑定的深入讲解
2018/04/02 PHP
PDO::_construct讲解
2019/01/27 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
2019/05/29 PHP
基于laravel belongsTo使用详解
2019/10/18 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
一个javascript参数的小问题
2008/03/02 Javascript
关于JS中的闭包浅谈
2013/08/23 Javascript
jQuery实现锚点scoll效果实例分析
2015/03/10 Javascript
分享有关jQuery中animate、slide、fade等动画的连续触发、滞后反复执行的bug
2016/01/10 Javascript
基于原生js淡入淡出函数封装(兼容IE)
2016/10/20 Javascript
webpack学习笔记之优化缓存、合并、懒加载
2017/08/24 Javascript
微信小程序如何获取用户手机号
2018/01/26 Javascript
vue click.stop阻止点击事件继续传播的方法
2018/09/04 Javascript
探秘vue-rx 2.0(推荐)
2018/09/21 Javascript
Vue.js标签页组件使用方法详解
2019/10/19 Javascript
通过实例解析jQ Ajax操作相关原理
2020/09/23 Javascript
解决await在forEach中不起作用的问题
2021/02/25 Javascript
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
Python Tkinter GUI编程入门介绍
2015/03/10 Python
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
matplotlib.pyplot绘图显示控制方法
2019/01/15 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
在Python中实现字典反转案例
2020/12/05 Python
html5使用canvas实现跟随光标跳动的火焰效果
2014/01/07 HTML / CSS
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
治超工作实施方案
2014/05/04 职场文书
新手上路标语
2014/06/20 职场文书
小学生勤俭节约演讲稿
2014/08/28 职场文书
学习党的群众路线剖析材料
2014/10/09 职场文书
2015年元旦晚会活动总结(学生会)
2014/11/28 职场文书
中层干部考核评语
2015/01/04 职场文书
作弊检讨书
2015/01/27 职场文书
JavaScript继承的三种方法实例
2021/05/12 Javascript