以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中遍历字典过程中更改元素导致异常的解决方法
May 12 Python
Python MySQLdb 使用utf-8 编码插入中文数据问题
Mar 13 Python
python素数筛选法浅析
Mar 19 Python
python使用xlrd和xlwt读写Excel文件的实例代码
Sep 05 Python
Django框架首页和登录页分离操作示例
May 28 Python
Python简单处理坐标排序问题示例
Jul 11 Python
在Python3 numpy中mean和average的区别详解
Aug 24 Python
Python笔记之观察者模式
Nov 20 Python
python matplotlib 绘图 和 dpi对应关系详解
Mar 14 Python
Python3实现个位数字和十位数字对调, 其乘积不变
May 03 Python
Django如何实现密码错误报错提醒
Sep 04 Python
Python request post上传文件常见要点
Nov 20 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 自定义错误处理函数的使用详解
2013/05/10 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
JQuery调webservice实现邮箱验证(检测是否可用)
2013/05/21 Javascript
用jquery生成二级菜单的实例代码
2013/06/24 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
jquery的ajax简单结构示例代码
2014/02/17 Javascript
JS 弹出层 定位至屏幕居中示例
2014/05/21 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
2015/09/04 Javascript
JS代码实现table数据分页效果
2016/05/26 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
jquery dialog获取焦点的方法
2017/02/09 Javascript
基于jQuery和CSS3实现APPLE TV海报视差效果
2017/06/16 jQuery
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
JS操作json对象key、value的常用方法分析
2019/10/29 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
vue实现图片按比例缩放问题操作
2020/08/11 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
微信小程序实现简单的select下拉框
2020/11/23 Javascript
Python标准库与第三方库详解
2014/07/22 Python
Python创建模块及模块导入的方法
2015/05/27 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
python能做哪方面的工作
2020/06/15 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
2021/01/09 Python
使用python对excel表格处理的一些小功能
2021/01/25 Python
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
Rossignol金鸡美国官网:始于1907年法国百年雪具品牌
2019/03/06 全球购物
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
运动会通讯稿100字
2014/01/31 职场文书
2015年安全工作总结范文
2015/04/02 职场文书
中学生国庆节演讲稿2015
2015/07/30 职场文书
php 文件上传至OSS及删除远程阿里云OSS文件
2021/07/04 PHP
MySQL分区路径子分区再分区
2022/04/13 MySQL