我们在开发WEB应用时,往往会需要对所有的url请求进行拦截,做些预处理,比如权限处理、日志等统一处理。

本文介绍一下Flask中的处理机制。我们通过一个简单的例子来说明。

1、编写一个简单应用 run.py,内容如下

from flask import Flask
from flask import render_template,request,redirect app = Flask(__name__) @app.before_request
def myredirect():
if not request.path=='/':
username = request.args.get('username')
if not username:
return redirect('/')
else:
print 'success' @app.route('/')
def hello_world():
return 'Hello World!' @app.route('/name')
def hello_name():
return 'this is name\n' @app.route('/show')
def show():
return 'this is show \n' if __name__ == '__main__':
app.debug = True
app.run('0.0.0.0',80)

上面代码中的关键是
@app.before_request

这个标识,flask会将所有的请求交给上面的myredirect()方法处理。

在这个方法中,判断请求路径是否是  / ,如果是不做任何处理,直接转到 / 对应的方法处理。

如果不是 / ,则检查url是否带username查询参数, 如果带了,则只是打印下信息,还是交给该url具体的路径处理;否则跳转到 / 请求。

2、完善前面的案例

有了前面这个基础,我们可以完善下前面文章《Flask web开发 处理Session》中的遗留问题。

我们修改 前面文章案例中的 run.py文件,修改后的内容如下:

from flask import Flask
from flask import render_template, redirect,url_for
from flask import request,session app = Flask(__name__) @app.before_request
def before_action():
print request.path
if request.path.find('.ico')==-1:
if not request.path=='/login':
if not 'username' in session:
session['newurl']=request.path
return redirect(url_for('login')) @app.route('/login', methods=['POST','GET'])
def login():
error = None
if request.method == 'POST':
if request.form['username']=='admin':
session['username'] = request.form['username']
if 'newurl' in session:
newurl = session['newurl']
session.pop('newurl', None)
return redirect(newurl)
else:
return redirect('/home')
else:
error = 'Invalid username/password'
return render_template('login.html', error=error) @app.route('/home')
def home():
return render_template('home.html',username=session['username']) @app.route('/test')
def test():
return render_template('test.html') app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT' if __name__ == '__main__':
app.debug = True
app.run('0.0.0.0',80)

上面代码增加了一个拦截方法。
该方法先判断请求是否是普通请求(图片等不做处理,这里是示例,直接写死了只对ico文件不处理,实际有问题)。

如果是普通请求,判断是否是login 请求。

如果不是login 请求,再判断session中是否已经有 username(也就是是否已经登录),如果没有则跳转到login页面。

Flask web开发 请求拦截和预处理的更多相关文章

  1. Flask web开发 处理Session

    本文我们在上篇文章<Flask web开发  处理POST请求(登录案例)>的基础上,来讲述Flask对session的支持. 在上面案例上,我们需要修改和新增如下功能 1.登录成功后的 ...

  2. 《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)

    目录 前言 第1章 安装 第2章 程序的基本结构 第3章 模板 第4章 Web表单 第5章 数据库 第6章 电子邮件 第7章 大型程序的结构   前言 学习Python也有一个半月时间了,学到现在感觉 ...

  3. Flask Web开发读书笔记

    开篇:目前想自学Flask Web开发--基于Python,找了几本书准备啃啃,同时也会分享读书笔记.希望和大家一起进步. Flask是小型框架,可以算是微框架,但是他的功能还是比较多 Flask有三 ...

  4. 《Flask Web开发实战:入门、进阶与原理解析(李辉著 )》PDF+源代码

    一句话评价: 这可能是市面上(包括国外出版的)你能找到最好的讲Flask的书了 下载:链接: https://pan.baidu.com/s/1ioEfLc7Hc15jFpC-DmEYBA 提取码: ...

  5. 学习参考《Flask Web开发:基于Python的Web应用开发实战(第2版)》中文PDF+源代码

    在学习python Web开发时,我们会选择使用Django.flask等框架. 在学习flask时,推荐学习看看<Flask Web开发:基于Python的Web应用开发实战(第2版)> ...

  6. Flask web开发 处理POST请求(登录案例)

    本文我们以一个登录例子来说明Flask对 post请求的处理机制. 1.创建应用目录,如 mkdir   example cd example 2.在应用目录下创建  run.py文件,内容如下 fr ...

  7. Flask Web开发从入门到放弃(一)

    第1章 章节一 01 内容概要 02 内容回顾 03 路飞学城之加入购物车 04 路飞学城之结算 05 路飞学城之立即支付 06 路飞学城之后续计划 07 Flask框架简介和快速使用 08 FLas ...

  8. Springboot 系列(六)Spring Boot web 开发之拦截器和三大组件

    1. 拦截器 Springboot 中的 Interceptor 拦截器也就是 mvc 中的拦截器,只是省去了 xml 配置部分.并没有本质的不同,都是通过实现 HandlerInterceptor ...

  9. [flask/python/web] 解析flask web开发(Miguel著)一书第11章主页不显示博文表单的问题

    ---------------------------------------------以下内容2017.7.14更新---------------------------------------- ...

随机推荐

  1. Protel99se教程五:protel99se的自动布线

    在上一节课的protel99se教程中,我们给大家演示的是,如何快速的将SCH原理PCB,也就是将元件转到PCB中,在这一节课,我们主要给大家讲解的是何在protel99se快速布线,我们在这节课当中 ...

  2. CodeIgniter中的session处理

    在CI中你可以这样很简单地装载library:     $this->load->library('newclass');    注意系统中会有两个library目录,一个是system/ ...

  3. Oracle select into from 和 insert into select

    select into from SQLSERVER  创建表: select * into aaa from bbb Oracle 创建表: create table aaa as select * ...

  4. Objective-c 协议(protocol)

    协议的作用类似地C++中对抽象基类的多重继承.类似于Java中的接口(interface)的概念.   协议是多个类共享方法的列表,协议中列出的方法在本类中并没有相应实现,而是别的类来实现这些方法. ...

  5. c#程序将excel文件转换成xml文件

    要程序你自己去组装去,我只写两个部分,一个是读Excel的部分,然后是写入到xml的1) 从指定的excel读出信息string strConn="provider=Microsoft.Je ...

  6. 前端笔试面试中的常用知识点总结(CSS)

    1.CSS选择器的优先级!important  > 内联 > id选择器 > 类选择器 > 标签选择器多个类选择器叠加(256)之后的优先级大于一个id选择器!importan ...

  7. BZOJ 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚( 线段树 )

    线段树.. -------------------------------------------------------------------------------------- #includ ...

  8. jQuery扩展extend一

    把这个扩展写在这里,以后要是忘了可以回头查看. (function(j) {// 这里的j是一个形参,表示传入的jQuery对象,j可以任意填写 j.extend({// 相当于给jQuery对象加上 ...

  9. shell 脚本中$$,$#,$?分别代表什么意思?

    $0 这个程式的执行名字$n 这个程式的第n个参数值,n=1..9$* 这个程式的所有参数,此选项参数可超过9个.$# 这个程式的参数个数$$ 这个程式的PID(脚本运行的当前进程ID号)$! 执行上 ...

  10. 怎样在VC里面使用graphics.h绘图

    网上很多绘图程序和小游戏程序都是用的 TC,在 VC 下编译时提示错误:fatal error C1083: Cannot open include file: 'graphics.h': No su ...