如果想用 Python编写网站,有许多Python Web框架供选择(还不少呢)。一个Web框架至少要具备处理客户端请求和服务端响应的能力。框架可能具备下面这些特性中的一种或多种。
路由
解析URL并找到对应的服务端文件或者Python服务器代码。
模板
把服务端数据合并成HTML页面。
认证和授权
处理用户名、密码和权限。
Session
处理用户在多次请求之间需要存储的数据。
先简单提下两个框架(bottle和flask),之后会介绍其他框架,用它们编写带数据库的网站非常方便。无论想编写什么网站都能找到合适的框架。
Bottle只包含一个简单的Python文件,所以非常易于使用并且易于部署。Bottle并不是 Python 标准库的一部分,需要使用命令安装。
Bottle是非常优秀的入门框架,但如果需要更多功能,就试试Flask吧。Flask最初只是2010年的一个愚人节玩笑,但是由于大家反响非常热烈,作者Armin Ronacher把它变成了一个真正的框架。有趣的是,Flask这个名字也是一个文字游戏 。
flask和bottle都有瓶子的意思。
Flask和Bottle一样易用,同时还支持很多专业Web开发需要的扩展功能,比如 Facebook 认证和数据库集成。很多人都喜欢Flask,因为它既好用又强大。
Flask包中自带了werkzeugWSGI 库和jinja2模板库,可从终端安装。
非Python的Web服务器
标准库的http.server或Bottle和Flask自带的调试用服务器都很简单。在生产环境中,我们需要用更快的Web服务器运行Python。下面是常用的选择:
apache加上mod_wsgi模块
nginx加上uWSGI应用服务器
两者都很不错。apache可能是最流行的,nginx更稳定并且占用内存更少。
1. Apache
Apache(http://httpd.apache.org/)Web 服务器中最好用的 WSGI 模块是mod_wsgi(https://code.google.com/p/modwsgi/)。这个模块可以在Apache进程中运行Python代码,也可以在独立进程中运行Python代码并和Apache进行通信。
如果你的系统是Linux或者OS X,那你已经有apache了。如果是 Windows,你需要安装apache(http://httpd.apache.org/docs/current/platform/windows.html)。
2. Nginx Web服务器
Nginx(http://nginx.org/)Web服务器没有内嵌的Python模块。它通过一个独立的WSGI服务器(比如 uWSGI)来和Python程序通信。把它们结合在一起可以实现高性能并且可配置的Python Web开发平台。
可从官网(http://wiki.nginx.org/Install)安装nginx。还需要安装 uWSGI(http://uwsgidocs.readthedocs.org/en/latest/Install.html)。uWSGI 是一个大系统,有许多需要调节的内容。可以在 http://flask.pocoo.org/docs/0.10/deploying/uwsgi/ 看到如何结合Flask、nginx和uWSGI。
其他框架
网站和数据库就像花生酱和果冻,它们经常一起出现。小型框架,比如bottle和flask,不能直接支持数据库,得通过一些插件实现。
如果需要开发基于数据库的网站,且数据库的结构不会经常变化,那最好试试大型Python Web框架,主流的框架有以下这些。
django(https://www.djangoproject.com/)
是最流行的,尤其受大型网站青睐。学习django的理由很多,其中最重要的就是Python的招聘要求中经常需要django的开发经验。它有ORM功能,可以在网页中自动应用典型的数据库CRUD功能(创建、替换、更新和删除)。也可以不用django自带的 ORM,选择SQLAlchemy 或者直接使用 SQL 查询语句。
web2py(http://www.web2py.com/)
和django功能类似,只是风格不同。
pyramid(http://www.pylonsproject.org/)
诞生于最早的pylons项目,和django很像。
turbogears(http://turbogears.org/)
这个框架支持 ORM、多种数据库以及多种模板语言。
wheezy.web(http://pythonhosted.org/wheezy.web/)
这是一个比较新的框架,为性能而生。在最近的测试中,它比其他框架都快(http://mindref.blogspot.com/2012/10/python-web-routing-benchmark.html)。
https://wiki.python.org/moin/WebFrameworks这个在线表格能帮你比较选择使用哪个框架。
如果你的网站使用的是关系数据库,就可以不使用大型框架,直接用bottle、flask这类框架结合关系数据库模块就行。也可以使用 SQLAlchemy 来屏蔽数据库的差异,直接写通用 SQL 代码。相比特定的 ORM 语法,大多数程序员更熟悉 SQL。
当然,你完全可以不使用关系数据库。如果数据结构差异很大——不同行的同一列差别很大——那或许应该试试无模式数据库。我之前开发的一个网站一开始使用 NoSQL 数据库来存储数据,后来切换到一个关系数据库,然后又切换到另一个关系数据库,接着又切换到一个 NoSQL 数据库,最后又切换回了一个关系数据库。
其他Python Web服务器
下面是一些类似apache和nginx的基于 Python 的 WSGI 服务器,使用多进程或线程来处理并发请求:
uwsgi(http://projects.unbit.it/uwsgi/)
cherrypy(http://www.cherrypy.org/)
pylons(http://www.pylonsproject.org/)
下面是一些基于事件的服务器,只使用单线程但不会阻塞:
tornado(http://www.tornadoweb.org)
gevent(http://gevent.org/)
gunicorn(http://gunicorn.org/)