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 11 Python
使用wxpython实现的一个简单图片浏览器实例
Jul 10 Python
Python之父谈Python的未来形式
Jul 01 Python
Python函数和模块的使用总结
May 20 Python
django-rest-framework 自定义swagger过程详解
Jul 18 Python
python实现邮件自动发送
Aug 10 Python
python使用socket 先读取长度,在读取报文内容示例
Sep 26 Python
Python如何优雅获取本机IP方法
Nov 10 Python
Python实现密钥密码(加解密)实例详解
Apr 26 Python
python自动化发送邮件实例讲解
Jan 04 Python
python使用numpy中的size()函数实例用法详解
Jan 29 Python
MATLAB 如何求取离散点的曲率最大值
Apr 16 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实现查询手机归属地的方法详解
2017/04/28 PHP
怎么用javascript进行拖拽
2006/07/20 Javascript
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
IE和firefox浏览器的event事件兼容性汇总
2009/12/06 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
2013/04/07 Javascript
jquery序列化form表单使用ajax提交后处理返回的json数据
2014/03/03 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
JavaScript基本类型值-Number类型
2017/02/24 Javascript
Vuex模块化实现待办事项的状态管理
2017/03/15 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
详解vue项目打包步骤
2019/03/29 Javascript
EXTJS7实现点击拖拉选择文本
2020/12/17 Javascript
python标准日志模块logging的使用方法
2013/11/01 Python
go和python调用其它程序并得到程序输出
2014/02/10 Python
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
pyqt5的QWebEngineView 使用模板的方法
2018/08/18 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
python爬虫解决验证码的思路及示例
2019/08/01 Python
Python中join()函数多种操作代码实例
2020/01/13 Python
美国高街时尚品牌:OASAP
2016/07/24 全球购物
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
SteelSeries赛睿官网:游戏外设和配件的领先制造商(耳机、键盘、鼠标和鼠标垫)
2018/06/17 全球购物
MIXIT官网:俄罗斯最大的化妆品公司之一
2020/01/25 全球购物
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
教师校本培训方案
2014/02/26 职场文书
药品营销策划方案
2014/06/15 职场文书
志愿者宣传口号
2014/06/17 职场文书
小学语文教研活动总结
2014/07/01 职场文书
抗洪救灾感谢信
2015/01/22 职场文书
情人节单身感言
2015/08/03 职场文书
关于车尾的标语大全
2015/08/11 职场文书
HTML页面滚动时部分内容位置固定不滚动的实现
2021/04/14 HTML / CSS
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL