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装饰器
May 09 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
Feb 19 Python
python使用SMTP发送qq或sina邮件
Oct 21 Python
用tensorflow构建线性回归模型的示例代码
Mar 05 Python
利用Python yagmail三行代码实现发送邮件
May 11 Python
Python高级特性切片(Slice)操作详解
Sep 27 Python
python学生信息管理系统(完整版)
Apr 05 Python
python的set处理二维数组转一维数组的方法示例
May 31 Python
python处理“
Jun 10 Python
运用PyTorch动手搭建一个共享单车预测器
Aug 06 Python
python实现本地批量ping多个IP的方法示例
Aug 07 Python
Python Selenium自动化获取页面信息的方法
Aug 31 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
laravel 5 实现模板主题功能
2015/03/02 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
2019/04/03 PHP
不一样的文字闪烁 轮番闪烁
2009/11/11 Javascript
JavaScript面向对象程序设计三 原型模式(上)
2011/12/21 Javascript
深入分析jquery解析json数据
2014/12/09 Javascript
使用javascript实现监控视频播放并打印日志
2015/01/05 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
全面解析JavaScript中apply和call以及bind(推荐)
2016/06/15 Javascript
使用伪命名空间封装保护独自创建的对象方法
2016/08/04 Javascript
浅谈Javascript中的Label语句
2016/12/14 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
基于jquery实现左右上下移动效果
2018/05/02 jQuery
微信小程序数据统计和错误统计的实现方法
2019/06/26 Javascript
angular中的post请求处理示例详解
2020/06/30 Javascript
解决vue加scoped后就无法修改vant的UI组件的样式问题
2020/09/07 Javascript
Django组件之cookie与session的使用方法
2019/01/10 Python
使用Python做垃圾分类的原理及实例代码附源码
2019/07/02 Python
python3实现二叉树的遍历与递归算法解析(小结)
2019/07/03 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
2019/09/25 Python
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
Django 自定义404 500等错误页面的实现
2020/03/08 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
英国水族馆和池塘用品购物网站:Warehouse Aquatics
2019/08/29 全球购物
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
自动化系在校本科生求职信
2013/10/23 职场文书
竞聘上岗演讲
2014/05/19 职场文书
计算机求职信
2014/07/02 职场文书
三方股东合作协议书
2014/10/28 职场文书
平安家庭事迹材料
2014/12/20 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
七年级作文之下雨天
2019/12/23 职场文书
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python
Django REST framework 限流功能的使用
2021/06/24 Python
MySQL 四种连接和多表查询详解
2021/07/16 MySQL