以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里disconnect UDP套接字的方法
Apr 23 Python
python脚本设置超时机制系统时间的方法
Feb 21 Python
详解Python装饰器由浅入深
Dec 09 Python
Python使用tkinter库实现文本显示用户输入功能示例
May 30 Python
python 获取图片分辨率的方法
Jan 08 Python
python os模块简单应用示例
May 23 Python
Python数据类型之列表和元组的方法实例详解
Jul 08 Python
Python分析彩票记录并预测中奖号码过程详解
Jul 09 Python
面向对象学习之pygame坦克大战
Sep 11 Python
Python中输入和输出(打印)数据实例方法
Oct 13 Python
Django 请求Request的具体使用方法
Nov 11 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
Feb 24 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
利用js调用后台php进行数据处理原码
2006/10/09 PHP
php&amp;java(三)
2006/10/09 PHP
PHP将XML转数组过程详解
2013/11/13 PHP
Yii rules常用规则示例
2016/03/15 PHP
利用Laravel生成Gravatar头像地址的优雅方法
2017/12/30 PHP
动态修改DOM 里面的 id 属性的弊端分析
2008/09/03 Javascript
20个非常有用的PHP类库 加速php开发
2010/01/15 Javascript
当前页禁止复制粘贴截屏代码小集
2013/07/24 Javascript
JavaScript对内存分配及管理机制详细解析
2013/11/11 Javascript
JS 新增Cookie 取cookie值 删除cookie 举例详解
2014/10/10 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
jQuery基于排序功能实现上移、下移的方法
2016/11/26 Javascript
基于webpack-hot-middleware热加载相关错误的解决方法
2018/02/22 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
原生JS实现逼真的图片3D旋转效果详解
2019/02/16 Javascript
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
Vue实现图书管理案例
2021/01/20 Vue.js
[06:21]2014DOTA2国际邀请赛 庆祝VG首阶段领跑;B叔为挣牛排半夜整理情报
2014/07/13 DOTA
[22:59]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
Python3基础之基本运算符概述
2014/08/13 Python
通过python+selenium3实现浏览器刷简书文章阅读量
2017/12/26 Python
python2.7无法使用pip的解决方法(安装easy_install)
2018/04/03 Python
Python连接Redis的基本配置方法
2018/09/13 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
2020/06/02 Python
QML用PathView实现轮播图
2020/06/03 Python
Betsey Johnson官网:妖娆可爱的连衣裙及鞋子、手袋和配件
2016/12/30 全球购物
微软瑞士官方网站:Microsoft瑞士
2018/04/20 全球购物
教师自荐书
2013/10/08 职场文书
应聘医药代表职位求职信
2013/10/21 职场文书
常务副总经理任命书
2014/06/05 职场文书
网吧七夕活动策划方案
2014/08/31 职场文书
贫困证明书范文
2015/06/16 职场文书
python实现简易自习室座位预约系统
2021/06/30 Python
MySQL transaction事务安全示例讲解
2022/06/21 MySQL
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis