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抓取网页中的图片示例
Feb 28 Python
Python切片用法实例教程
Sep 08 Python
Python的消息队列包SnakeMQ使用初探
Jun 29 Python
python 基础教程之Map使用方法
Jan 17 Python
Python正则表达式教程之三:贪婪/非贪婪特性
Mar 02 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
Jan 09 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
Dec 04 Python
浅谈Python基础—判断和循环
Mar 22 Python
python实现日志按天分割
Jul 22 Python
python 判断三个数字中的最大值实例代码
Jul 24 Python
django跳转页面传参的实现
Sep 17 Python
Python闭包的定义和使用方法
Apr 11 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禁止直接从浏览器输入地址访问.php文件的方法
2014/11/04 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
基于jquery的一行代码轻松实现拖动效果
2010/12/28 Javascript
js禁止页面刷新禁止用F5键刷新禁止右键的示例代码
2013/09/23 Javascript
jquery通过visible来判断标签是否显示或隐藏
2014/05/08 Javascript
JavaScript中实现最高效的数组乱序方法
2014/10/11 Javascript
window.open()实现post传递参数
2015/03/12 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
jquery实现九宫格大转盘抽奖
2015/11/13 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
EsLint入门学习教程
2017/02/17 Javascript
JS使用cookie实现只出现一次的广告代码效果
2017/04/22 Javascript
AngularJS中重新加载当前路由页面的方法
2018/03/09 Javascript
详解js常用分割取字符串的方法
2019/05/15 Javascript
nodejs读取图片返回给浏览器显示
2019/07/25 NodeJs
JQuery基于FormData异步提交数据文件
2020/09/01 jQuery
使用python实现strcmp函数功能示例
2014/03/25 Python
python检测某个变量是否有定义的方法
2015/05/20 Python
Python根据已知邻接矩阵绘制无向图操作示例
2018/06/23 Python
Python实现正整数分解质因数操作示例
2018/08/01 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
2020/03/03 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
python 实现简单的计算器(gui界面)
2020/11/11 Python
PyCharm最新激活码PyCharm2020.2.3有效
2020/11/18 Python
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
毕业自我鉴定
2013/11/05 职场文书
工程管理专业个人求职信范文
2013/12/07 职场文书
清明节演讲稿
2014/05/27 职场文书
2014幼儿园家长工作总结
2014/11/10 职场文书
学前班幼儿评语大全
2014/12/29 职场文书
2015年计划生育协会工作总结
2015/05/13 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书
怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
2021/11/21 数码科技
Windows server 2012搭建FTP服务器
2022/04/29 Servers