以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获取图片颜色信息的方法
Mar 18 Python
简单了解Python下用于监视文件系统的pyinotify包
Nov 13 Python
python基本语法练习实例
Sep 19 Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
Jan 23 Python
python MysqlDb模块安装及其使用详解
Feb 23 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
Jul 16 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
Nov 10 Python
对python内置map和six.moves.map的区别详解
Dec 19 Python
python 实现交换两个列表元素的位置示例
Jun 26 Python
基于python3抓取pinpoint应用信息入库
Jan 08 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
Mar 13 Python
django 实现后台从富文本提取纯文本
Jul 02 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
Thinkphp中的curd应用实用要点
2015/01/04 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
2013/12/19 Javascript
javascript制作网页图片上实现下雨效果
2015/02/26 Javascript
微信小程序 SocketIO 实例讲解
2016/10/13 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
vuejs父子组件之间数据交互详解
2017/08/09 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
2018/05/16 Javascript
微信小程序实现聊天对话(文本、图片)功能
2018/07/06 Javascript
小程序组件之自定义顶部导航实例
2019/06/12 Javascript
JsonProperty 的使用方法详解
2019/10/11 Javascript
javascript数组的定义及操作实例
2019/11/10 Javascript
[06:53]2018DOTA2国际邀请赛寻真——为复仇而来的Newbee
2018/08/15 DOTA
Python数据操作方法封装类实例
2017/06/23 Python
pygame游戏之旅 添加键盘按键的方法
2018/11/20 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
Python猴子补丁知识点总结
2020/01/05 Python
Python3实现飞机大战游戏
2020/04/24 Python
基于matplotlib中ion()和ioff()的使用详解
2020/06/16 Python
python与c语言的语法有哪些不一样的
2020/09/13 Python
python实现简单的tcp 文件下载
2020/09/16 Python
利用python+request通过接口实现人员通行记录上传功能
2021/01/13 Python
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
乌克兰最大的家用电器和电子产品连锁店:Eldorado
2019/10/02 全球购物
《乡愁》教学反思
2014/02/18 职场文书
工作迟到检讨书
2014/02/21 职场文书
校园绿化美化方案
2014/06/08 职场文书
卫生厅领导班子党的群众路线教育实践活动整改措施
2014/09/20 职场文书
土木工程专业本科生求职信
2014/10/01 职场文书
政协会议宣传标语
2014/10/09 职场文书
英雄儿女观后感
2015/06/09 职场文书
浅析InnoDB索引结构
2021/04/05 MySQL
Python初学者必备的文件读写指南
2021/06/23 Python
MyBatis核心源码深度剖析SQL语句执行过程
2022/05/20 Java/Android