以Flask为例讲解Python的框架的使用方法


Posted in Python onApril 29, 2015

了解了WSGI框架,我们发现:其实一个Web App,就是写一个WSGI的处理函数,针对每个HTTP请求进行响应。

但是如何处理HTTP请求不是问题,问题是如何处理100个不同的URL。

每一个URL可以对应GET和POST请求,当然还有PUT、DELETE等请求,但是我们通常只考虑最常见的GET和POST请求。

一个最简单的想法是从environ变量里取出HTTP请求的信息,然后逐个判断:

def application(environ, start_response):
  method = environ['REQUEST_METHOD']
  path = environ['PATH_INFO']
  if method=='GET' and path=='/':
    return handle_home(environ, start_response)
  if method=='POST' and path='/signin':
    return handle_signin(environ, start_response)
  ...

只是这么写下去代码是肯定没法维护了。

代码这么写没法维护的原因是因为WSGI提供的接口虽然比HTTP接口高级了不少,但和Web App的处理逻辑比,还是比较低级,我们需要在WSGI接口之上能进一步抽象,让我们专注于用一个函数处理一个URL,至于URL到函数的映射,就交给Web框架来做。

由于用Python开发一个Web框架十分容易,所以Python有上百个开源的Web框架。这里我们先不讨论各种Web框架的优缺点,直接选择一个比较流行的Web框架——Flask来使用。

用Flask编写Web App比WSGI接口简单(这不是废话么,要是比WSGI还复杂,用框架干嘛?),我们先用easy_install或者pip安装Flask:

$ easy_install flask

然后写一个app.py,处理3个URL,分别是:

  1.     GET /:首页,返回Home;
  2.     GET /signin:登录页,显示登录表单;
  3.     POST /signin:处理登录表单,显示登录结果。

注意噢,同一个URL/signin分别有GET和POST两种请求,映射到两个处理函数中。

Flask通过Python的装饰器在内部自动地把URL和函数给关联起来,所以,我们写出来的代码就像这样:

from flask import Flask
from flask import request

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def home():
  return '<h1>Home</h1>'

@app.route('/signin', methods=['GET'])
def signin_form():
  return '''<form action="/signin" method="post">
       <p><input name="username"></p>
       <p><input name="password" type="password"></p>
       <p><button type="submit">Sign In</button></p>
       </form>'''

@app.route('/signin', methods=['POST'])
def signin():
  # 需要从request对象读取表单内容:
  if request.form['username']=='admin' and request.form['password']=='password':
    return '<h3>Hello, admin!</h3>'
  return '<h3>Bad username or password.</h3>'

if __name__ == '__main__':
  app.run()

运行python app.py,Flask自带的Server在端口5000上监听:

$ python app.py 
 * Running on http://127.0.0.1:5000/
Try

打开浏览器,输入首页地址http://localhost:5000/:

以Flask为例讲解Python的框架的使用方法

首页显示正确!

再在浏览器地址栏输入http://localhost:5000/signin,会显示登录表单:

以Flask为例讲解Python的框架的使用方法

输入预设的用户名admin和口令password,登录成功:

以Flask为例讲解Python的框架的使用方法

输入其他错误的用户名和口令,登录失败:

以Flask为例讲解Python的框架的使用方法

实际的Web App应该拿到用户名和口令后,去数据库查询再比对,来判断用户是否能登录成功。

除了Flask,常见的Python Web框架还有:

  •    Django:全能型Web框架;
  •     web.py:一个小巧的Web框架;
  •    Bottle:和Flask类似的Web框架;
  •     Tornado:Facebook的开源异步Web框架。

当然了,因为开发Python的Web框架也不是什么难事,我们后面也会自己开发一个Web框架。
小结

有了Web框架,我们在编写Web应用时,注意力就从WSGI处理函数转移到URL+对应的处理函数,这样,编写Web App就更加简单了。

在编写URL处理函数时,除了配置URL外,从HTTP请求拿到用户数据也是非常重要的。Web框架都提供了自己的API来实现这些功能。Flask通过request.form['name']来获取表单的内容。

Python 相关文章推荐
详细解析Python中__init__()方法的高级应用
May 11 Python
python实现图片变亮或者变暗的方法
Jun 01 Python
Python实现的RSS阅读器实例
Jul 25 Python
Python中shutil模块的常用文件操作函数用法示例
Jul 05 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
python 从csv读数据到mysql的实例
Jun 21 Python
python 格式化输出百分号的方法
Jan 20 Python
python中使用while循环的实例
Aug 05 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
Jun 03 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
Feb 02 Python
python3 hdf5文件 遍历代码
May 19 Python
Python 用户输入和while循环的操作
May 23 Python
详解Python程序与服务器连接的WSGI接口
Apr 29 #Python
Python的SQLAlchemy框架使用入门
Apr 29 #Python
python使用post提交数据到远程url的方法
Apr 29 #Python
python实现根据ip地址反向查找主机名称的方法
Apr 29 #Python
连接Python程序与MySQL的教程
Apr 29 #Python
python实现通过代理服务器访问远程url的方法
Apr 29 #Python
python实现带错误处理功能的远程文件读取方法
Apr 29 #Python
You might like
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
php读取msn上的用户信息类
2008/12/05 PHP
PHP学习笔记(三):数据类型转换与常量介绍
2015/04/17 PHP
Yii框架自定义数据库操作组件示例
2019/11/11 PHP
jquery下利用jsonp跨域访问实现方法
2010/07/29 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
JavaScript获取页面中第一个锚定文本的方法
2015/04/03 Javascript
JavaScript实现简单Tip提示框效果
2016/04/20 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
2017/03/29 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
2017/07/15 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
详解JS模块导入导出
2017/12/20 Javascript
微信小程序按钮去除边框线分享页面功能
2018/08/27 Javascript
详解JSON和JSONP劫持以及解决方法
2019/03/08 Javascript
[31:00]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS iG
2014/05/25 DOTA
详解Python中的静态方法与类成员方法
2017/02/28 Python
python 筛选数据集中列中value长度大于20的数据集方法
2018/06/14 Python
DES加密解密算法之python实现版(图文并茂)
2018/12/06 Python
Python构建图像分类识别器的方法
2019/01/12 Python
python中的句柄操作的方法示例
2019/06/20 Python
python3的print()函数的用法图文讲解
2019/07/16 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
Python数据可视化:幂律分布实例详解
2019/12/07 Python
解决pycharm中导入自己写的.py函数出错问题
2020/02/12 Python
python实现TCP文件传输
2020/03/20 Python
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
手工制作的意大利太阳镜和光学元件:Illesteva
2019/01/19 全球购物
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
特色蛋糕店创业计划书
2014/01/28 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
董事长助理工作职责范本
2014/07/01 职场文书
高中班主任心得体会
2016/01/07 职场文书
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android
OpenCV实现常见的四种图像几何变换
2022/04/01 Python