第九篇 Flask的before_request和after_request
Flask我们已经学习很多基础知识了,现在有一个问题
我们现在有一个 Flask 程序其中有3个路由和视图函数,如下:
from flask import Flask
app = Flask(__name__) # type:Flask
@app.route("/login")
def login():
return "Login"
@app.route("/index")
def index():
return "Index"
@app.route("/home")
def home():
return "Login"
app.run("0.0.0.0", 5000)
简单的小程序
如果登陆了,就可以访问 index 和 home 页面,如果没登录就跳转到 login 登录
要怎么解决呢, session 对, 用 session 除了 Login 函数之外的所有函数里面全校验 session 是否登录了
太麻烦了,现在咱们只有3个函数,如果成百上千个怎么整啊
装饰器,对没错,装饰器是一个很好的方案,但是啊,我现在还是成败上千个函数,我要在每一个函数定义的时候加上@装饰器,还是很麻烦
那么就引出了我们@app.before_request
1.@app.before_request 在请求(request)进入视图函数之前做出处理
from flask import Flask
from flask import request
from flask import redirect
from flask import session app = Flask(__name__) # type:Flask
app.secret_key = "DragonFire" @app.before_request
def is_login():
if request.path == "/login":
return None if not session.get("user"):
return redirect("/login") @app.route("/login")
def login():
return "Login" @app.route("/index")
def index():
return "Index" @app.route("/home")
def home():
return "Login" app.run("0.0.0.0", 5000) 解决所有问题
解决所有问题
@app.before_request 也是一个装饰器,他所装饰的函数,都会在请求进入视图函数之前执行
request.path 是来读取当前的url地址如果是 /login 就允许直接通过 return None 你可以理解成通过放行
校验session中是否有user 如果没有的话,证明没有登录,所以毫不留情的 redirect("/login") 跳转登录页面
2. @app.after_request 在响应(response)之前做出响应
@app.after_request
def foot_log(environ):
if request.path != "/login":
print("有客人访问了",request.path)
return environ
3、执行顺序问题
from flask import Flask
app = Flask(__name__) @app.before_request
def A():
print('a')
@app.before_request
def B():
print('b')
@app.before_request
def C():
print('c') @app.after_request
def a(res):
print('A')
return res
@app.after_request
def b(res):
print('B')
return res
@app.after_request
def c(res):
print('C')
return res @app.route('/')
def login():
print('haha')
return 'haha' if __name__ == '__main__':
app.run("127.0.0.1",5000,debug=True)
如上所示执行顺序为:A->B->C->视图函数->c->b->a
如果B函数检验没有通过,则执行顺序为:A->B->c->b->a
第九篇 Flask的before_request和after_request的更多相关文章
- 第九篇 Flask 中的蓝图(BluePrint)
第九篇 Flask 中的蓝图(BluePrint) 蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? ...
- Flask最强攻略 - 跟DragonFire学Flask - 第九篇 Flask 中的蓝图(BluePrint)
蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...
- Flask中before_request与after_request使用
目录 1.前提,装饰器的弊端 2.before_request与after_request 2.1 before_request分析: 2.2 after_request分析: 3.before_re ...
- Flask之before_request、after_request
1.@app.before_request在请求(request)|在视图函数 之前做出响应 解决所有问题 from flask import Flask from flask import re ...
- flask 第九篇 蓝图 Blueprint
蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...
- 解剖SQLSERVER 第九篇 OrcaMDF现在能通过系统DMVs显示元数据(译)
解剖SQLSERVER 第九篇 OrcaMDF现在能通过系统DMVs显示元数据(译) http://improve.dk/orcamdf-now-exposes-metadata-through-s ...
- 第九篇 SQL Server代理了解作业和安全
本篇文章是SQL Server代理系列的第九篇,详细内容请参考原文 在这一系列的上一篇,学习了如何在SQL Server代理作业步骤启动外部程序.你可以使用过时的ActiveX系统,运行批处理命令脚本 ...
- 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容
第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...
- 第九篇 Integration Services:控制流任务错误
本篇文章是Integration Services系列的第九篇,详细内容请参考原文. 简介在前面三篇文章,我们创建了一个新的SSIS包,学习了脚本任务和优先约束,并检查包的MaxConcurrentE ...
随机推荐
- Mysql的MyISAM和InnoDB存储引擎的区别
从以下几个方面: 1.存储结构 每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型. .frm文件存储表定义. 数据文件的扩展名为.MYD (MYData). ...
- 基于hap的文件上传和下载
序言 现在,绝大部分的应用程序在很多的情况下都需要使用到文件上传与下载的功能,在本文中结合hap利用spirng mvc实现文件的上传和下载,包括上传下载图片.上传下载文档.前端所使用的技术不限,本文 ...
- Maven中jar包冲突的解决方式
现象 创建一个maven工程,引入spring-context包. <dependency> <groupId>org.springframework</groupId& ...
- java架构之路-(spring源码篇)springIOC容器源码解析(上)
我们这次来叭叭一下Spring的源码,这次博客主要来说说Spring源码,先粗略的撸一遍,下篇博客选几个重点去说,由于过于复杂,我也是看了一点点,我们先来过一遍源码,然后上流程图,最后我们再回头总结一 ...
- Python selenium+phantomjs的js动态爬取
Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozilla Firefox.Chrome等.Phanto ...
- JavaSE----01.Java简介
01.Java简介 1.java介绍 Java是于1995年由Sun公司推出的一种跨平台.面向对象的高级程序设计语言.Java最初的名字叫OAK.Java是一种通过解释方式来执行的语言,其语法 ...
- 【TencentOS tiny】深度源码分析(3)——队列
队列基本概念 队列是一种常用于任务间通信的数据结构,队列可以在任务与任务间.中断和任务间传递消息,实现了任务接收来自其他任务或中断的不固定长度的消息,任务能够从队列里面读取消息,当队列中的消息是空时, ...
- Redis Sentinel(哨兵核心机制) 初步深入
##### 1.Redis 的 Sentinel 系统用于管理多个 Redis 服务 该系统执行以下三个任务: 1.监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务 ...
- Python的字符串编码
本文用实验详细地演示了Python2和Python3在字符串编码上的区别. 在Python2中,字符串字面量对应于8位的字符或面向字节编码的字节字面量.这些字符串的一个重要限制是它们无法完全地支持国际 ...
- axios学习和使用
网络请求的方式 传统的Ajax,基于XMLHttpRequest(不推荐) 配置调用方式混乱(回调地狱) jQuery-Ajax (在vue开发中不推荐) 相对于传统的Ajax非常好用 但是jQuer ...