以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的汉字转GBK码实现代码
Feb 19 Python
Python判断操作系统类型代码分享
Nov 22 Python
深入理解Python变量与常量
Jun 02 Python
不可错过的十本Python好书
Jul 06 Python
python 3.7.0 安装配置方法图文教程
Aug 27 Python
如何使用Python进行OCR识别图片中的文字
Apr 01 Python
Django Sitemap 站点地图的实现方法
Apr 29 Python
python的依赖管理的实现
May 14 Python
Python 控制终端输出文字的实例
Jul 12 Python
Python合并2个字典成1个新字典的方法(9种)
Dec 19 Python
使用python快速实现不同机器间文件夹共享方式
Dec 22 Python
Python实现序列化及csv文件读取
Jan 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
Linux下实现PHP多进程的方法分享
2012/08/16 PHP
PHP 线程安全与非线程安全版本的区别深入解析
2013/08/06 PHP
php根据身份证号码计算年龄的实例代码
2014/01/18 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
2014/11/04 PHP
在php中设置session用memcache来存储的方法总结
2016/01/14 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
Laravel框架实现的使用smtp发送邮件功能示例
2019/03/12 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
2019/08/27 PHP
Jquery 1.42 checkbox 全选和反选代码
2010/03/27 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
jQuery中Form相关知识汇总
2015/01/06 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
JS中利用swiper实现3d翻转幻灯片实例代码
2017/08/25 Javascript
微信小程序连续签到7天积分获得功能的示例代码
2020/08/20 Javascript
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
[04:51]TI10典藏宝瓶Ⅱ外观视频展示
2020/08/15 DOTA
Python开发的单词频率统计工具wordsworth使用方法
2014/06/25 Python
django轻松使用富文本编辑器CKEditor的方法
2017/03/30 Python
python select.select模块通信全过程解析
2017/09/20 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
python使用selenium实现批量文件下载
2019/03/11 Python
PyQt5实现QLineEdit添加clicked信号的方法
2019/06/25 Python
使用python turtle画高达
2020/01/19 Python
pytorch加载自己的图像数据集实例
2020/07/07 Python
Django数据库迁移常见使用方法
2020/11/12 Python
英国男士时尚网站:Dandy Fellow
2018/02/09 全球购物
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
教师应聘个人求职信
2013/12/10 职场文书
硕士研究生自我鉴定范文
2013/12/27 职场文书
健康教育评估方案
2014/05/25 职场文书
2014年小学德育工作总结
2014/12/05 职场文书
音乐会主持人开场白
2015/05/28 职场文书
《文化苦旅》读后感:阅读,让人诗意地栖居在大地上
2019/12/24 职场文书
golang中切片copy复制和等号复制的区别介绍
2021/04/27 Golang
vue3中provide && inject的使用
2021/07/01 Vue.js