标题：web.py
安装
安装web.py, 请先下载：
http://webpy.org/static/web.py-0.37.tar.gz
或者获取最新的开发版：
https://github.com/webpy/webpy/tarball/master
解压并拷贝 web 文件夹到你的应用程序目录下。 或者，为了让所有的应用程序都可以使用，运行：
python setup.py install
注意: 在某些类unix系统上你可能需要切换到root用户或者运行：
sudo python setup.py install
查看 推荐设置.
另外一个选择是使用Easy Install. Easy Install 使用如下：
easy_install web.py
或者 PIP
sudo pip install web.py
安装完毕之后，就可以正式开始web.py 之旅…
URL 处理
对于一个站点来说，URL 的组织是最重要的一个部分，因为这是用户看得到的部分，而且直接影响到站点是如何工作的，在著名的站点如：del.icio.us ，其URLs 甚至是网页界面的一部分。而web.py 以简单的方式就能够构造出一个强大的URLs。
在每个web.py 应用，必须先import web 模块：
import web
现在，我们须要告诉web.py URL 如何组织，让我们以一个简单例子开始：
urls = (
'/', 'index' )
在上面的例子中，第一部分（‘/’）是一个匹配URL 的正则表达式，像/，/help/faq，/item/(\d+)，等等；第二部分（‘index’）是一个类名，匹配的请求将会被发送过去。
现在，我们需要编写index 类。当大部人浏览网页的时候，他们都没有注意到，浏览器是通过HTTP 跟World Wide Web 通信的。通信的细节不太重要，但要明白一点，用户是通过URLs（例如 / 或者 /foo?f=1）来请求web 服务器完成一定请求的（例如 GET 或者POST）。
GET 是最普遍的方法，用来请求一个页面。当我们在浏览器里输入“harvard.edu” 的时候，实际上它是向Web 服务器请求GET ”/“。另一个常见的方法是POST，常用于提交特定类型的表单，例如利用信用卡付费和处理一个订单。注意，GET URLs 能够被搜索引擎索引得到（想像一下Google 尝试购买你网站上的所用物品）。
在我们的web.py 代码中。我们清晰区分这两种方法：
class index:
def GET(self):
print "Hello, world!"
当接收到一个GET 请求时，上面的GET 方法将会被web.py 调用。
好的。现在，我们只需添加最后一行代码，让web.py 启动网页应用：
if __name__ == "__main__": web.run(urls, globals())
上面告诉web.py 如何配置URLs，以及找寻的类在文件中的全局命名空间。
整个code.py 文件的内容如下：
import web
urls = (
'/', 'index' )
class index:
def GET(self):
print "Hello, world!"
if __name__ == "__main__": web.run(urls, globals())
注意到没有，虽然我说了很多东西，但实际上web 应用的代码就只得上面的几行，而且这是一个完整的web.py 应用。在你的命令行下输入：
$ python code.py
Launching server: http://0.0.0.0:8080/
现在，你的web.py 应用已经启动了服务器。通过浏览器访问http://localhost:8080/ 的话，会见到”Hello, world！“。在启动服务器的时候，你可以在python code.py 后面添加IP 地址/端口 来控制web.py 启动的服务器。例如：python code.py 8888。
调试
web.py 本身也提供调试的工具。在最后的“if name …” 代码前面添加：
web.webapi.internalerror = web.debugerror
并在最后的“if name …” 添加”web.reloader“：
if __name__ == "__main__": web.run(urls, globals(), web.reloader)
上面的代码会使你在调试的阶段得到更多有用的信息。web.reloader 其实是一个中间件，当你在运行时修改了code.py 文件后，web.reloader 会重新加载code.py 文件，让你在浏览器上立刻可以看到变化。如何有多何变化的话，还是需要重新启动服务器。web.py 也提供web.profiler ,可以输出有用的信息，有关每个页面的每个函数调用的次数，这用助于你改善代码。
web.py 的确相当的小巧，应当归属于轻量级的web 框架。但这并不影响web.py 的强大，而且使用起来很简单、很直接。在实际应用上，web.py 更多的是学术上的价值，因为你可以看到更多web 应用的底层，这在当今“抽象得很好”的web 框架上是学不到的 ：） 如果想了解更多web.py，可以访问web.py 的官方文档。
开发
web.py 内置了web服务器。可以按照 tutorial 学习如何写一个Web应用。 写完后，将你的代码放到 code.py 并如下面的方法来启动服务器：
python code.py
打开你的浏览器输入 http://localhost:8080/ 查看页面。 若要制定另外的端口，使用 python code.py 1234。产品现在所运行 web.py 程序的web服务器是挺不错的， 但绝大多数网站还是需要更加专业一些的web服务器。web.py 实现了 WSGI 并能在任何兼容它的服务器上运行。 WSGI 是一个web服务器与应用程序之间的通用API, 就如Java 的 Servlet 接口。 你需要安装 flup (download here) 使web.py 支持with CGI， FastCGI 或 SCGI， flup提供了这些API的WSGI接口。
对于所有的CGI变量， 添加以下到你的 code.py:
#!/usr/bin/env python
并运行 chmod +x code.py 添加可执行属性。
LightTPD使用 FastCGI在产品中通过FastCGI结合lighttpd是web.py使用的一种推荐方法。 reddit.com 通过该方法来处理百万次的点击。
lighttpd config设置参考如下：
server.modules = ("mod_fastcgi", "mod_rewrite")
server.document-root = "/path/to/root/" 
fastcgi.server = ( "/code.py" => 
(( "socket" => "/tmp/fastcgi.socket",
"bin-path" => "/path/to/root/code.py",
"max-procs" => 1
))
)
url.rewrite-once = (
"^/favicon.ico$" => "/static/favicon.ico",
"^/static/(.*)$" => "/static/$1",
"^/(.*)$" => "/code.py/$1"
)
在某些版本的lighttpd中， 需要保证fastcgi.server选项下的"check-local"属性设置为"false", 特别是当你的 code.py 不在文档根目录下。
如果你得到错误显示不能够导入flup， 请在命令行下输入 "easy_install flup" 来安装。
从修订版本 145开始， 如果你的代码使用了重定向，还需要在fastcgi选项下设置bin-environment变量。 如果你的代码重定向到http://domain.com/ 而在url栏中你会看到 http://domain.com/code.py/， 你可以通过设置这个环境变量来阻止。 这样你的fastcgi.server设置将会如下：
fastcgi.server = ( "/code.py" =>
((
"socket" => "/tmp/fastcgi.socket",
"bin-path" => "/path/to/root/code.py",
"max-procs" => 1,
"bin-environment" => (
"REAL_SCRIPT_NAME" => ""
),
"check-local" => "disable"
))
)
Apache
使用 CGI
添加以下到 httpd.conf 或 apache2.conf。
Alias /foo/static/ /path/to/static
ScriptAlias /foo/ /path/to/code.py
.. 使用 CGI .htaccess
CGI很容易配置， 但不适合高性能网站。 添加以下到你的 .htaccess：
Options +ExecCGI
AddHandler cgi-script .py
将你的浏览器指向 http://example.com/code.py/。 不要忘记最后的斜杠，否则你将会看到 not found 消息 (因为在 urls 列表中你输入的没有被匹配到). 为了让其运行的时候不需要添加 code.py， 启用mod_rewrite 法则 (查看如下)。
注意: web.py 的实现破坏了 cgitb 模块，因为它截取了 stdout。 可以通过以下的方法来解决该问题：
import cgitb; cgitb.enable()
import sys
# ... import web etc here...
def cgidebugerror():
""" 
""" _wrappedstdout = sys.stdout
sys.stdout = web._oldstdout
cgitb.handler()
sys.stdout = _wrappedstdout
web.internalerror = cgidebugerror使用 FastCGIFastCGI很容易配置，运行方式如同mod_python。
添加以下到 .htaccess：
<Files code.py> SetHandler fastcgi-script
</Files>
不幸的是, 不像lighttpd, Apache不能够暗示你的web.py脚本以FastCGI 服务器的形式工作，因此你需要明确的告诉web.py。 添加以下到 code.py的 if __name__ == "__main__": 行前：
web.wsgi.runwsgi = lambda func, addr=None: web.wsgi.runfcgi(func, addr)
将你的浏览器指向 http://example.com/code.py/。 不要忘记最后的斜杠，否则你将会看到 not found 消息 (因为在 urls 列表中你输入的没有被匹配到). 为了让其运行的时候不需要添加 code.py， 启用mod_rewrite 法则 (查看如下)。
Walter 还有一些额外建议.使用 SCGIhttps://www.mems-exchange.org/software/scgi/ 从 http://www.mems-exchange.org/software/files/mod_scgi/ 下载 mod_scgi 代码 windows apache 用户： 编辑 httpd.conf：
LoadModule scgi_module Modules/mod_scgi.so
SCGIMount / 127.0.0.1:8080
重启apache，并在命令行中如下方式启动code.py：
python code.py 127.0.0.1:8080 scgi
打开你的浏览器，访问127.0.0.1 It's ok!
.. 使用 mod_python
mod_python 运行方式如同FastCGI， 但不是那么方便配置。
对于 Python 2.5 按照如下：
cd /usr/lib/python2.5/wsgiref
# or in windows: cd /python2.5/lib/wsgiref
wget -O modpython_gateway.py http://projects.amor.org/misc/browser/modpython_gateway.py?format=raw
# or fetch the file from that address using your browser
对于 Python <2.5 按照如下：
cd /usr/lib/python2.4/site-packages
# or in windows: cd /python2.4/lib/site-packages
svn co svn://svn.eby-sarna.com/svnroot/wsgiref/wsgiref
cd wsgiref
wget -O modpython_gateway.py http://projects.amor.org/misc/browser/modpython_gateway.py?format=raw
# or fetch the file from that address using your browser 
重命名 code.py 为 codep.py 或别的名字， 添加：
app = web.application(urls, globals())
main = app.wsgifunc()
在 .htaccess 中， 添加：
AddHandler python-program .py
PythonHandler wsgiref.modpython_gateway::handler
PythonOption wsgi.application codep::main
你应该希望添加 RewriteRule 将 / 指向 /codep.py/
确保访问 /codep.py/ 的时候有添加最后的 /。 否则，你将会看到一条错误信息，比如 A server error occurred. Please contact the administrator.
.. 使用 mod_wsgi
mod_wsgi 是一个新的Apache模块 通常优于mod_python 用于架设WSGI应用，它非常容易配置。
在 code.py 的最后添加：
app = web.application(urls, globals(), autoreload=False)
application = app.wsgifunc()
mod_wsgi 提供 许多可行方法 来实现WSGI应用, 但一种简单的方法是添加以下到 .htaccess：
<Files code.py>
SetHandler wsgi-script
Options ExecCGI FollowSymLinks
</Files>
如果在apache的 error.log 文件中出现 "ImportError: No module named web"， 在导入web之前，你可能需要在code.py中尝试设置绝对路径：
import sys, os
abspath = os.path.dirname(__file__)
sys.path.append(abspath)
os.chdir(abspath)
import web
同时， 你可能需要查看 WSGI应用的常见问题的 "Application Working Directory" 部分。
最终应该可以访问 http://example.com/code.py/。
mod_rewrite 法则，Apache
如果希望 web.py 能够通过 'http://example.com' 访问，代替使用 'http://example.com/code.py/'， 添加以下法则到 .htaccess 文件：
<IfModule mod_rewrite.c> 
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !^/icons
RewriteCond %{REQUEST_URI} !^/favicon.ico$
RewriteCond %{REQUEST_URI} !^(/.*)+code.py/
RewriteRule ^(.*)$ code.py/$1 [PT]
</IfModule>
如果 code.py 在子目录 myapp/中， 调整 RewriteBase 为 RewriteBase /myapp/。 如果还有一些静态文件如CSS文件和图片文件, 复制这些并改成你需要的地址。