我们在开发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. arm中的ldr指令

    label .equ 0x53000000 ldr r0, label : 将0x53000000地址处的值放入r0中 ldr r0, =label : 将0x53000000付值给r0.

  2. html常用标签有哪些

    html看似复杂,其实常用的标签并不多,这里总共介绍一些html的常用标签 文字处理: ①标题:<h1> to <h6> ②段落:<p>文字段落</p> ...

  3. 盛希泰:办公室就像男人的春药——人的一生的精力是有限的,你把有限的时间分配给谁决定你的成败——你有N多选择,你人生的积累就是N多选择加起来的结果

    欢迎关注“创事记”的微信订阅号:sinachuangshiji 创事记注:12月22日晚上,盛希泰在清华大学旧经管报告厅面对清华师生讲了一堂<创业引导课>.本文由洪泰帮根据课堂录音整理完成 ...

  4. python 启动简单web服务器

    有时我们在开发web静态页面时,需要一个web服务器来测试. 这时可以利用python提供的web服务器来实现. 1.在命令行下进入某个目录 2.在该目录下运行命令: python -m Simple ...

  5. activemq在windows下启动报错,闪退问题

    查验了网上各种方法,都没搞定,最后楼主决定按照linux的解决套路来,把windows计算机名称改为纯英文字母,原计算机名:lee_pc,修改后为leepc,然后重启电脑,再重新运行activemq. ...

  6. HashMap和HashTable 学习

    1. HashMap 1)  hashmap的数据结构 Hashmap是一个数组和链表的结合体(在数据结构称“链表散列“),如下图示: 当我们往hashmap中put元素的时候,先根据key的hash ...

  7. JavaBean讲解 规范

    一:JavaBean定义 JavaBean是一种可重复使用.跨平台的软件组件.JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean,例如NetBean中 ...

  8. Android蓝牙开发深入解析

    1. 使用蓝牙的响应权限  代码如下: <uses-permission android:name="android.permission.BLUETOOTH" /> ...

  9. SQL 语言划分

    从功能上划分,SQL 语言能够分为DDL,DML和DCL三大类. 1. DDL(Data Definition Language)     数据定义语言,用于定义和管理 SQL 数据库中的全部对象的语 ...

  10. WPF自学笔记

    WPF使用哪几种元素作为顶级元素: 1. Window元素 2. Page元素(与Window元素类似,用于可导航的应用程序) 3. Application元素(定义应用程序资源和启动设置) PS:在 ...