以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将ip地址转换成整数的方法
Mar 17 Python
python3简单实现微信爬虫
Apr 09 Python
Python实现的径向基(RBF)神经网络示例
Feb 06 Python
Python代码实现删除一个list里面重复元素的方法
Apr 02 Python
python3文件复制、延迟文件复制任务的实现方法
Sep 02 Python
Python实现PyPDF2处理PDF文件的方法示例
Sep 25 Python
Django配置文件代码说明
Dec 04 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
Apr 02 Python
基于TensorFlow的CNN实现Mnist手写数字识别
Jun 17 Python
详解Python中import机制
Sep 11 Python
Python 快速验证代理IP是否有效的方法实现
Jul 15 Python
python中pymysql包操作数据库方法
Apr 19 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
聊天室php&amp;mysql(六)
2006/10/09 PHP
一篇入门的php Class 文章
2007/04/04 PHP
探讨:parse url解析URL,返回其组成部分
2013/06/14 PHP
基于PHP实现的事件机制实例分析
2015/06/18 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
JavaScript高级程序设计 事件学习笔记
2011/09/10 Javascript
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
Jquery-1.9.1源码分析系列(十一)之DOM操作
2015/11/25 Javascript
js实现卡片式项目管理界面UI设计效果
2015/12/08 Javascript
js实现的彩色方块飞舞奇幻效果
2016/01/27 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
vue生成token保存在客户端localStorage中的方法
2017/10/25 Javascript
JS/HTML5游戏常用算法之碰撞检测 像素检测算法实例详解
2018/12/12 Javascript
Vue多环境代理配置方法思路详解
2019/06/21 Javascript
微信小程序实现图片选择并预览功能
2019/07/25 Javascript
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
Python入门之三角函数atan2()函数详解
2017/11/08 Python
使用tensorflow实现AlexNet
2017/11/20 Python
python微信跳一跳游戏辅助代码解析
2018/01/29 Python
python 连接各类主流数据库的实例代码
2018/01/30 Python
Python中max函数用于二维列表的实例
2018/04/03 Python
Python之用户输入的实例
2018/06/22 Python
python 对txt中每行内容进行批量替换的方法
2018/07/11 Python
Python 实现「食行生鲜」签到领积分功能
2018/09/26 Python
python3常用的数据清洗方法(小结)
2019/10/31 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
部队学习十八大感言
2014/01/11 职场文书
幼儿园大班新学期寄语
2014/01/18 职场文书
医学生临床实习自我评价
2014/03/07 职场文书
体育系毕业生求职自荐信
2014/04/16 职场文书
安全技术说明书
2014/05/09 职场文书
高一军训的心得体会
2014/09/01 职场文书
2016年教师新年寄语
2015/08/18 职场文书