使用 Twisted 框架进行网络编程,第 2 部分
2008-11-13 13:14:25 来源:WEB开发网清单 4. www/Weblog.rpy 动态 Weblog 页面
from twisted.web import resource, server
from persist import Records
from webloglib import log_fields, TOP, ROW, END, COLOR
import webloglib as wll
records = registry.getComponent(Records)
if not records:
records = Records()
registry.setComponent(Records, records)
class Resource(resource.Resource):
def render(self, request):
request.write(TOP)
odd = 0
for rec in records.getNew():
print rec
hit = [field.strip('"') for field in log_fields(rec)]
if hit[wll.status]=='200' and hit[wll.referrer]!='-':
resource = hit[wll.request].split()[1]
referrer = hit[wll.referrer].replace('&',' &')
request.write(ROW % (COLOR[odd],referrer,resource))
odd = not odd
request.write(END)
request.finish()
return server.NOT_DONE_YET
resource = Resource()
一开始会对注册表产生的疑惑是 Weblog.rpy 从未导入它。.rpy 脚本和纯 .py 脚本不完全一样 - 前者在 Twisted 环境 中运行,该环境提供了对其中的 register 的自动访问。 request 对象是另一个来自框架而非 .rpy 自身的东西。
还请注意返回页面内容的方式,这种方式有些新鲜。上面不只返回 HTML 字符串,我们将几次针对 request 对象的写操作高速缓存起来,然后通过调用 request.finish() 来完成这些工作。模样奇特的返回值 server.NOT_DONE_YET 是一个标记,要求 Twisted 服务器将页面内容清出 request 对象。另一个选项是将 Deferred 对象添加到请求中,并在执行对 Deferred 的回调时处理页面(例如,如果直到数据库查询完成后才能生成页面)。
更多精彩
赞助商链接