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 判断一个进程是否存在
Apr 09 Python
使用Python中的greenlet包实现并发编程的入门教程
Apr 16 Python
使用基于Python的Tornado框架的HTTP客户端的教程
Apr 24 Python
Python调用C# Com dll组件实战教程
Oct 12 Python
python图像常规操作
Nov 11 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
Apr 21 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
Dec 15 Python
Pytorch实现的手写数字mnist识别功能完整示例
Dec 13 Python
使用python自动追踪你的快递(物流推送邮箱)
Mar 17 Python
Python经典五人分鱼实例讲解
Jan 04 Python
python生成随机数、随机字符、随机字符串
Apr 06 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
Jun 21 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仿微信红包分配算法的实现方法
2016/05/13 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
php中通用的excel导出方法实例
2017/12/30 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
2018/05/31 PHP
PHP使用CURL实现下载文件功能示例
2019/06/03 PHP
扩展String功能方法
2006/09/22 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
利用node.js本地搭建HTTP服务器
2017/04/19 Javascript
React Native时间转换格式工具类分享
2017/10/24 Javascript
微信小程序tabBar模板用法实例分析【附demo源码下载】
2017/11/28 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
15分钟学会vue项目改造成SSR(小白教程)
2019/12/17 Javascript
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
2020/01/04 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
用Python的urllib库提交WEB表单
2009/02/24 Python
Python易忽视知识点小结
2015/05/25 Python
Python验证码识别处理实例
2015/12/28 Python
对Python进行数据分析_关于Package的安装问题
2017/05/22 Python
python使用opencv按一定间隔截取视频帧
2018/03/06 Python
使用 Python 实现微信群友统计器的思路详解
2018/09/26 Python
django的聚合函数和aggregate、annotate方法使用详解
2019/07/23 Python
django rest framework 实现用户登录认证详解
2019/07/29 Python
Python连接SQLite数据库并进行增册改查操作方法详解
2020/02/18 Python
python mysql中in参数化说明
2020/06/05 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
美国在线购买空气净化器、除湿器、加湿器网站:AllergyBuyersClub
2021/03/16 全球购物
文秘专业毕业生就业推荐信
2013/11/08 职场文书
学校门卫管理制度
2014/01/30 职场文书
大学社团活动总结
2014/04/26 职场文书
党员专题组织生活会发言材料
2014/10/17 职场文书
四风问题党员个人整改措施
2014/10/27 职场文书
详解如何使用Node.js实现热重载页面
2021/05/06 Javascript
Python天气语音播报小助手
2021/09/25 Python
一条 SQL 语句执行过程
2022/03/17 MySQL
CSS中calc(100%-100px)不加空格不生效
2023/05/07 HTML / CSS