以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中函数的用法实例教程
Sep 08 Python
跟老齐学Python之正规地说一句话
Sep 28 Python
python实现模拟按键,自动翻页看u17漫画
Mar 17 Python
Python基于Tkinter实现的记事本实例
Jun 17 Python
python实现判断数组是否包含指定元素的方法
Jul 15 Python
Python生成随机验证码的两种方法
Dec 22 Python
python定时检测无响应进程并重启的实例代码
Apr 22 Python
python根据多个文件名批量查找文件
Aug 13 Python
Python ORM编程基础示例
Feb 02 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
Jun 17 Python
解决Pytorch半精度浮点型网络训练的问题
May 24 Python
关于python爬虫应用urllib库作用分析
Sep 04 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 伪造本地文件包含漏洞的代码
2011/11/03 PHP
领悟php接口中interface存在的意义
2013/06/27 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
2014/07/28 PHP
浅谈PHP值mysql操作类
2016/06/29 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
JSON 学习之JSON in JavaScript详细使用说明
2010/02/23 Javascript
jQuery UI AutoComplete 自动完成使用小记
2010/08/21 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/06 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
jQuery的事件预绑定
2016/12/05 Javascript
jQuery实现可拖动进度条实例代码
2017/06/21 jQuery
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
新手简单了解vue
2019/05/29 Javascript
Vue项目中数据的深度监听或对象属性的监听实例
2020/07/17 Javascript
jQuery实现本地存储
2020/12/22 jQuery
[06:16]《DAC最前线》之地区预选赛全面回顾
2015/01/19 DOTA
[05:03]2018DOTA2亚洲邀请赛主赛事首日回顾
2018/04/04 DOTA
Python检测QQ在线状态的方法
2015/05/09 Python
使用Python更换外网IP的方法
2018/07/09 Python
django DRF图片路径问题的解决方法
2018/09/10 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
Python调用百度根据经纬度查询地址的示例代码
2019/07/07 Python
python+pygame实现坦克大战
2019/09/10 Python
matplotlib基础绘图命令之errorbar的使用
2020/08/13 Python
利用CSS3实现圆角的outline效果的教程
2015/06/05 HTML / CSS
Big Green Smile德国网上商店:提供各种天然产品
2018/05/23 全球购物
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
美国杰西潘尼官网:JCPenney
2019/06/12 全球购物
高中毕业生自我鉴定
2013/11/03 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
2015年学校教研室主任工作总结
2015/07/20 职场文书
如何书写邀请函?
2019/06/24 职场文书
总结python多进程multiprocessing的相关知识
2021/06/29 Python
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis