以Flask为例讲解Python的框架的使用方法
了解了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,分别是:
- get /:首页,返回home;
- get /signin:登录页,显示登录表单;
- 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/:
首页显示正确!
再在浏览器地址栏输入http://localhost:5000/signin,会显示登录表单:
输入预设的用户名admin和口令password,登录成功:
输入其他错误的用户名和口令,登录失败:
实际的web app应该拿到用户名和口令后,去数据库查询再比对,来判断用户是否能登录成功。
除了flask,常见的python web框架还有:
当然了,因为开发python的web框架也不是什么难事,我们后面也会自己开发一个web框架。
小结
有了web框架,我们在编写web应用时,注意力就从wsgi处理函数转移到url+对应的处理函数,这样,编写web app就更加简单了。
在编写url处理函数时,除了配置url外,从http请求拿到用户数据也是非常重要的。web框架都提供了自己的api来实现这些功能。flask通过request.form['name']来获取表单的内容。
推荐阅读
-
通过抓取淘宝评论为例讲解Python爬取ajax动态生成的数据(经典)
-
以911新闻为例演示Python实现数据可视化的教程
-
以Flask为例讲解Python的框架的使用方法
-
iframe框架流量分析 以导航站为例谈框架流量的应用
-
QuickOffice的使用方法以将word文档放进iphone为例
-
以一个投票程序的实例来讲解Python的Django框架使用
-
python爬取你感兴趣图片,构建你自己的数据集(以英雄联盟为例)
-
Scrapy框架结合Spynner采集需进行js,ajax动态加载的网页并提取网页信息(以采集微信公众号文章列表为例)
-
简单理解以vue为例的mvvm框架原理
-
CentOS下的编译源代码安装软件( 以安装python3为例 )