之前用 django 做过一个小的站点,感觉django太过笨重,于是就准备换一个比较轻量级的 web 框架来玩玩。web.py 作者已经挂掉,项目好久没有更新,所以不准备用它。而 flask 也是一个成熟的轻量级 web 框架,在 github 上有众多的 star 和 fork,文档和扩展也很丰富,值得学习。
学习一个框架最好的方式就是用框架做一个项目,在实战中理解掌握框架。这里我用 flask 框架,使用 mysql 数据库做了一个 论坛系统 。麻雀虽小,五脏俱全,论坛效果图如下:
web应用程序
以 python 为例,使用python开发web,最原始和直接的办法是使用cgi标准,在1998年这种方式很流行。首先确保 web 服务器支持cgi及已经配置了cgi的处理程序,然后设置好cgi目录,在目录里面添加相应的 python 文件,每一个 python 文件处理相应输入,生成一个 html 文件即可,如下例:
# !/usr/bin/python
# -*- coding: utf-8 -*-
print “content-type:text/html”
print # 空行,告诉服务器结束头部
print ”
print ”
print ”
print ”
print ”
print ‘hello word! 我是一个cgi程序’
print ”
print ”
这样在浏览器访问该文件就可以得到一个简单的 hello world 网页内容。直接通过 cgi 写 web 应用程序看起来很简单,每一个文件处理输入,生成html。但是实际开发中,可能会遇到许多不方便的地方。比如:
每个独立的cgi脚本可能会重复写数据库连接,关闭的代码; 后端开发者会看到一堆 content-type 等和自己无关的 html 页面元素; web 框架
早期开发站点确做了许多重复性劳动,后来为了减少重复,避免写出庞杂,混乱的代码,人们将 web 开发的关键性过程提取出来,开发出了各种 web 框架。有了框架,就可以专注于编写清晰、易维护的代码,无需关心数据库连接之类的重复性工作。
其中一种比较经典的web框架采用了 mvc 架构,如下图所示:
mvc 架构
用户输入 url,客户端发送请求,控制器(controller)首先会拿到请求,然后用模型(models)从数据库取出所有需要的数据,进行必要的处理,将处理后的结果发送给 视图(view),视图利用获取到的数据,进行渲染生成 html response返回给客户端。
以 python web 框架 flask 为例,框架本身并不限定我们用哪种架构来组织我们的应用,不过 flask 可以很好地支持以 mvc 方式组织应用。
控制器:flask 可以用装饰器来添加路由项,如下:
@app.route(‘/’)
def main_page():
pass
模型:主要用来取出需要的数据,如下面函数中操作:
@app.route(‘/’)
def main_page():
“””searches the database for entries, then displays them.”””
db = get_db()
cur = db.execute(‘select * from entries order by id desc’)
entries = cur.fetchall()
return render_template(‘index.html’, entries=entries)
视图:flask 利用 jinja2 来渲染页面,下面的模版文件指定了页面的样式:
{% for entry in entries %}
{{ entry.title }}
{{ entry.text|safe }}
{% else %}
no entries yet. add some!
{% endfor %}
我们知道python有着许多的 web 框架,而同时又有着许多的 web 服务器(apache, nginx, gunicorn等),框架和web服务器之间需要进行通信,如果在设计时它们之间不可以相互匹配的,那么选择了一个框架就会限制对 web 服务器的选择,这显然是不合理的。
那么,怎样确保可以在不修改web服务器代码或网络框架代码的前提下,使用自己选择的服务器,并且匹配多个不同的网络框架呢?答案是接口,设计一套双方都遵守的接口就可以了。对python来说,就是wsgi(web server gateway interface,web服务器网关接口)。其他编程语言也拥有类似的接口:例如java的servlet api和ruby的rack。
python wsgi的出现,让开发者可以将 web 框架与 web 服务器的选择分隔开来,不再相互限制。现在,你可以真正地将不同的 web 服务器与web框架进行混合搭配,选择满足自己需求的组合。例如,可以使用 gunicorn 或nginx/uwsgi来运行django、flask或web.py应用。
更多python 搭建web站点之web服务器与web框架相关文章请关注php中文网!