以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随机生成带特殊字符的密码
Mar 02 Python
python 文件操作api(文件操作函数)
Aug 28 Python
python字典多键值及重复键值的使用方法(详解)
Oct 31 Python
Python中动态创建类实例的方法
Mar 24 Python
python多进程和多线程究竟谁更快(详解)
May 29 Python
Python中的上下文管理器和with语句的使用
Apr 17 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
May 11 Python
python 列表中[ ]中冒号‘:’的作用
Apr 30 Python
python pandas获取csv指定行 列的操作方法
Jul 12 Python
Python检测端口IP字符串是否合法
Jun 05 Python
python进度条显示-tqmd模块的实现示例
Aug 23 Python
python uuid生成唯一id或str的最简单案例
Jan 13 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中实现Javascript的escape()函数代码
2010/08/08 PHP
微信支付开发交易通知实例
2016/07/12 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
js传值 判断
2006/10/26 Javascript
遍历jquery对象的代码分享
2011/11/02 Javascript
使用js对select动态添加和删除OPTION示例代码
2013/08/12 Javascript
判断滚动条到底部的JS代码
2013/11/04 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
2016/11/23 Javascript
Vue.js组件tree实现省市多级联动
2016/12/02 Javascript
对比分析Django的Q查询及AngularJS的Datatables分页插件
2017/02/07 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
2019/01/18 jQuery
详解vue2.6插槽更新v-slot用法总结
2019/03/09 Javascript
react native 仿微信聊天室实例代码
2019/09/17 Javascript
Vue常用的全选/反选的示例代码
2020/02/19 Javascript
vue实现点击出现操作弹出框的示例
2020/11/05 Javascript
Python3中常用的处理时间和实现定时任务的方法的介绍
2015/04/07 Python
Python实现Smtplib发送带有各种附件的邮件实例
2017/06/05 Python
Python中动态检测编码chardet的使用教程
2017/07/06 Python
基于Python实现用户管理系统
2019/02/26 Python
python pygame实现球球大作战
2019/11/25 Python
Flask处理Web表单的实现方法
2021/01/31 Python
HTML5的download属性详细介绍和使用实例
2014/04/23 HTML / CSS
基于HTML5的齿轮动画特效
2016/02/29 HTML / CSS
湖南卫视在线视频媒体平台:芒果TV
2019/10/30 全球购物
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
异步传递消息系统的作用
2016/05/01 面试题
电子商务专业学生职业生涯规划
2014/03/07 职场文书
主持词开场白
2014/03/17 职场文书
后进基层党组织整改方案
2014/10/25 职场文书
入党现实表现材料
2014/12/23 职场文书
2019入党申请书格式
2019/06/25 职场文书
浅谈mysql哪些情况会导致索引失效
2021/11/20 MySQL