首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Twisted 框架进行网络编程--实现 Web 服务器(1)

使用 Twisted 框架进行网络编程--实现 Web 服务器(1)

增强 Weblog 服务器的功能我们之前研究过价值甚微的服务器,它使用定制协议以及定制服务器和客户机来远程监控网站的访问率。对于本文,让我们用基于 Web 的接口来增强该功能。在我们的方案中可以使用某个 URL 来监控网站所接收的访问量。
对于基于 Web 的 Weblog服务器,有一种非常简单的方法,它与 Twisted 在本质上毫不相干。假定您只让像 Weblog.html 这样的 Web 页面列出有关对网站的最近几次访问的信息。与前面的示例保持一致的同时,我们将显示访问的提交者和资源,但是只有在请求的状态码为         200 (并且提交者可用)时才如此。在我的网站(请参阅 以获取链接)上可以找到此类页面(其内容没有更新)的示例。      
我们需要做两件事:(1) 将         <meta http-equiv=refresh ...> 标记放在 HTML 头中,使显示保持最新;(2) 一旦发生新的访问就间歇地重写 Weblog.html 文件本身。第二个任务只需要一个一直运行的后台进程,例如:      
清单 1. logmaker.py Weblog 刷新器脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    from webloglib import log_fields, TOP, ROW, END, COLOR
import webloglib as wll
from urllib import unquote_plus as uqp
import os, time
LOG = open('../access-log')
RECS = []
PAGE = 'www/weblog.html'
while 1:
    page = open(PAGE+'.tmp','w')
    RECS.extend(LOG.readlines())
    RECS = RECS[-35:]
    print >> page, TOP
    odd = 0
    for rec in RECS:
        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 = uqp(hit[wll.referrer]).replace('&',' &')
            print >> page, ROW % (COLOR[odd], referrer, resource)
            odd = not odd
    print >> page, END
    page.close()
    os.rename(PAGE+'.tmp',PAGE)
    time.sleep(5)




模块         Webloglib 中包含了所使用的精确 HTML,以及用于日志字段位置的一些常量。您可以从 所列出的 URL 中下载该模块。      
这里要注意的是:不必将 Twisted 用作服务器 - Apache 或任何其他 Web 服务器都可以很好地担当此任。
创建 Twisted Web 服务器运行 Twisted Web 服务器非常简单 - 或许比启动其他服务器还要简单。运行 Twisted Web 服务器的第一步是创建一个 .tap 文件,就像我们在第一篇文章中所看到的那样。您        可以通过在脚本中定义应用程序、包括对         application.save() 的调用然后运行该脚本来创建 .tap 文件。但是您也可以使用工具 mktap 来创建 .tap 文件。事实上,对于许多公共协议,您可以创建服务器 .tap 文件,而完全不需要任何特殊的脚本。例如:      
mktap Web --path ~/twisted/www --port 8080
这创建了一个非常通用的服务器,它在端口 8080 上处理来自基本目录 ~/twisted/www 的文件。要运行该服务器,请使用工具        twistd来启动所创建的 Web.tap 文件。      
twistd -f Web.tap
对于 HTTP 之外的其他类型的服务器,您也可以使用其他名称来代替         Web :         dns 、         conch 、         news 、         telnet 、         im 和         manhole 等。这些名称中有些是常见的服务器,其他则特定于 Twisted。而且一直都可以添加更多名称。      
正好位于基本目录的任何静态 HTML 文件都可以由该服务器进行传递,这和其他服务器非常相似。但是另外有一点,您还可以处理扩展名为 .rpy 的动态页面 - 从概念上讲,这些动态页面类似于 CGI 脚本,但是它们避免了减慢 CGI 速度的派生(fork)开销和解释器启动时间。Twisted 动态脚本的结构与 CGI 脚本略有不同;最简单的情况下它可以类似于:
清单 2. www/dynamic.rpy Twisted 页面
1
2
3
4
5
6
7
8
9
10
from twisted.web import resource
page = '''<html><head><title>Dynamic Page</title></head>
<body>
  <p>Dynamic Page served by Twisted Matrix</p>
</body>
</html>'''
class Resource(resource.Resource):
    def render(self, request):
        return page
resource = Resource()




文件级变量         resource 很特殊 - 它需要指向         twisted.web.resource.Resource 子类的实例,该类定义了         .render() 方法。您在所处理的目录中想包括多少动态页面就可以包括多少,并且可以自动处理每个页面。      
使用 Twisted 来更新静态页面在我的第一篇 Twisted 文章中所提出的定时回调技术可以用来定期更新上面所讨论的 Weblog.html 文件。也就是说,您可以用非阻塞         twisted.internet.reactor.callLater() 调用来替换         logmaker.py 中的         time.sleep() 调用:      
清单 3. tlogmaker.py Weblog 刷新器脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from webloglib import log_fields, TOP, ROW, END, COLOR
import webloglib as wll
from urllib import unquote_plus as uqp
import os, twisted.internet
LOG = open('../access-log')
RECS = []
PAGE = 'www/weblog.html'
def update():
    global RECS
    page = open(PAGE+'.tmp','w')
    RECS.extend(LOG.readlines())
    RECS = RECS[-35:]
    print >> page, TOP
    odd = 0
    for rec in RECS:
        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 = uqp(hit[wll.referrer]).replace('&',' &')
            print >> page, ROW % (COLOR[odd], referrer, resource)
            odd = not odd
    print >> page, END
    page.close()
    os.rename(PAGE+'.tmp',PAGE)
    twisted.internet.reactor.callLater(5, update)
update()
twisted.internet.reactor.run()




logmaker.py 和         tlogmaker.py 的差别不大 - 两者都可以在后台启动并且都可以让它们一直运行以更新页面         referesher.html 。更有趣的是可以将         tlogmaker.py 目录构建到 Twisted 服务器中,而不是仅让它在后台进程中运行。这非常简单,我们只需要在该脚本结尾处再添加两行:      
from twisted.web import static         
resource = static.File("~/twisted/www")        
还可以除去对         twisted.internet.reactor.run() 的调用。通过这些更改,使用下面两行脚本创建服务器:      
1
2
3
mktap --resource-script=tlogmaker.py --port 8080
        <br>
--path ~/twisted/www




然后像前面那样使用         twistd 来运行已创建的         web.tap 服务器。现在 Web 服务器自己可以使用其标准核心分派循环每五秒钟刷新一下页面 Weblog.html。
返回列表