以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中dictionary items()系列函数的用法实例
Aug 21 Python
python检查序列seq是否含有aset中项的方法
Jun 30 Python
Django进阶之CSRF的解决
Aug 01 Python
python修改txt文件中的某一项方法
Dec 29 Python
python高斯分布概率密度函数的使用详解
Jul 10 Python
Python的Lambda函数用法详解
Sep 03 Python
Windows下实现将Pascal VOC转化为TFRecords
Feb 17 Python
Python模块相关知识点小结
Mar 09 Python
python中使用input()函数获取用户输入值方式
May 03 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
如何清空python的变量
Jul 05 Python
python smtplib发送多个email联系人的实现
Oct 09 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
Laravel框架学习笔记(一)环境搭建
2014/10/15 PHP
php实现图片上传时添加文字和图片水印技巧
2020/04/18 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
Prototype Function对象 学习
2009/07/12 Javascript
js二维数组排序的简单示例代码
2014/01/24 Javascript
javascript中的return和闭包函数浅析
2014/06/06 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
IE浏览器不支持getElementsByClassName的解决方法
2014/08/27 Javascript
使用js dom和jquery分别实现简单增删改
2014/09/11 Javascript
JavaScript中const、var和let区别浅析
2016/10/11 Javascript
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
JS实现的计数排序与基数排序算法示例
2017/12/04 Javascript
利用vue和element-ui设置表格内容分页的实例
2018/03/02 Javascript
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
vue里如何主动销毁keep-alive缓存的组件
2019/03/21 Javascript
vue配置接口域名方法总结
2019/05/12 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
2020/07/20 Javascript
SpringBoot在yml配置文件中配置druid的操作
2020/11/16 Javascript
[11:01]2014DOTA2西雅图邀请赛 冷冷带你探秘威斯汀
2014/07/08 DOTA
[52:22]EG vs VG Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
Python爬取个人微信朋友信息操作示例
2018/08/03 Python
Python常见排序操作示例【字典、列表、指定元素等】
2018/08/15 Python
pandas中的series数据类型详解
2019/07/06 Python
Django 删除upload_to文件的步骤
2020/03/30 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
html5的画布canvas——画出简单的矩形、三角形实例代码
2013/06/09 HTML / CSS
html5通过postMessage进行跨域通信的方法
2017/12/04 HTML / CSS
英国最大的老式糖果店:A Quarter Of
2017/04/08 全球购物
存储过程的优缺点是什么
2015/01/10 面试题
Servlet如何得到客户端机器的信息
2014/10/17 面试题
安卓程序员求职信
2014/02/28 职场文书
经理岗位职责
2015/02/02 职场文书
详解python字符串驻留技术
2021/05/21 Python
详解Python中*args和**kwargs的使用
2022/04/07 Python