Rack:处理 HTTP 请求更简单

  • Mirko Stocker
  • 李明(nasi)

2008 年 4 月 15 日

话题:RubyWeb框架Ruby on Rails语言 & 开发架构

Rack提供了 Web 服务器和 Ruby 开发框架之间的接口。它将框架编写者从为每个 Web 服务器单独编写一个处理模块的繁重负担中解脱出来,可以节省大量重复劳动。

Rack 相当易用,如下示例便可以让你创建一个运行于Mongrel上的极简应用处理器:

require 'rack'

app = lambda { |env| [200, {"Content-Type" => "text/plain"}, ['Hello World!']] }

Rack::Handler::Mongrel.run(app, :Port => 3000)

参数env包括一个环境变量和请求参数的散列。代码块的返回值由带有三个元素的数组组成:HTTP 状态码、响应头和响应体。

Rack 的创始人 Christian Neukirchen 为 InfoQ 分享了一些 Rack 的历史:

起初,我对 Ruby 的 Web 开发框架的状态感觉不太舒服,于是有了自己写的打算。正当这时,web.py发布了,我很喜欢它那么精致而又易于维护。所以我开始编写自己的框架,但是没有成功,因为我写了很多计划外的东西,例如 Cookie 解析等等。实际上我从其他的项目中拷贝了一些代码过来,但是要做的工作依然令人厌烦。于是这个框架作废了。

后来,我了解到了Python 的 Nevow,并试图去模仿它开发一些东西。但是就在我刚开始开发的时候,我发现我正在为不同的服务器重写辅助方法(helper)和适配器(adapter)。在深入的了解 Python 框架之时,我偶然发现了WSGI,我阅读它、喜欢它、简化它,并最终完成了 Rack 的原形。我重新组织了已写代码,并基于Python Paste的结构模块化,很快 Rack 0.1 就已经完成了。

当 Rack 可用之时,我依然没有喜欢的框架,所以我开发了Coset,这也是我最近一直在用的框架。它的设计灵感来自于Campingweb.pyRESTlet

已经有相当多的框架提供了对 Rack 的支持

* Camping(包含在 Rack 发行版中)

* Coset

* Halcyon

* Maveric

* Merb

* Mack

* Racktools::SimpleApplication

* Ramaze

* Rails(第三方,与 thin 协同交付)

* Sinatra

* Vintage

Rack 可以和框架协同使用。例如,如果想简便而快速的处理一个确定的请求,Rack 的Rack::Cascade可以将几个应用级联起来。这篇Ezra Zygmuntowicz 的博客讲解了如何通过 Rack 实现文件上传,而不需要访问整个 merb 栈。

接下来,Christian 计划稳定其规范,为 1.0 发布版做准备。

要了解更多 Rack 的信息,请访问Rack 的官方网站。希望了解更深入的信息的话,这里还有一篇关于 Rack 的内部工作机制的Euruko 07 论文

查看英文原文:Rack: HTTP request handling made easy

RubyWeb框架Ruby on Rails语言 & 开发架构