2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

Rack:处理 HTTP 请求更简单

  • 2008-04-15
  • 本文字数:1010 字

    阅读完需:约 3 分钟

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

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

<pre id="a7yh">require 'rack'<br id="twiq"></br>app = lambda { |env| [200, {"Content-Type" => "text/plain"}, ['Hello World!']] }<br id="qsr7"></br>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 ,这也是我最近一直在用的框架。它的设计灵感来自于 Camping web.py RESTlet

已经有相当多的框架提供了对 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

2008-04-15 21:511560
用户头像

发布了 80 篇内容, 共 23.2 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

龙蜥开发者说:亲历从基础设施构建到系统质量保障,龙蜥未来可期 | 第 19 期

OpenAnolis小助手

Linux 开源 sig 龙蜥开发者说 联通数科

Apache Doris 1.2.4 Release 版本正式发布|版本通告

SelectDB

数据库 大数据 数据分析 Doris 联邦查询和分析

《爱在黎明破晓前 | 我有话要说》

后台技术汇

三周年连更

2023 年要避免的 17 个致命的网站设计错误

海拥(haiyong.site)

三周年连更

NCCL源码解析③:机器内拓扑分析

OneFlow

2022-04-27:用go语言重写ffmpeg的remuxing.c示例。

福大大架构师每日一题

golang ffmpeg

Java 中的 null 到底是什么?

Java架构历程

Java 三周年连更

2023移动端技术探索

轻口味

android 移动端 行业趋势 三周年连更

轻量级协作任务管理看板

顿顿顿

敏捷开发 任务管理 敏捷开发管理工具 看板工具 scrum工具

【源码分析】【seata】at 模式分布式事务 -xid隐式传递

如果晴天

源码分析 分布式事务 seata spring-cloud Seata框架

数据标注,优化模型辅助标注、Label 库管理|ModelWhale 版本更新

ModelWhale

云计算 编程 模型 数据标注 数据门户

ZincSearch 一款 Elasticsearch 的轻量级替代品

宇宙之一粟

Go 三周年连更 ZincSearch

在oracle apex中的Dialog的做法(第一部门):

back_wang

oracle dialog oracle ebs ebs

Go的内存模型:如何保证并发读写的顺序性?

Jack

eBPF的发展演进---从石器时代到成为神(四)

统信软件

操作系统 Linux Kenel

iOS MachineLearning 系列(8)—— 图片热区分析

珲少

中国厨房更净一步:一场科技“下凡”带来的方太式浪漫

脑极体

ChatGPT 在 Python WEB 的Prompt项目分享

Marvin

Python 开发 ChatGPT

ChatGPT-4!又双叒叕写了一本量化交易的书(附下载)

量化投资与机器学习

机器学习 量化投资 ChatGPT4 对冲基金 Quant

人工智能训练数据集:误区、挑战与应对方法

数据堂

和ChatGPT结对完成VS CODE插件项目分享

Marvin

vscode 插件 插件开发 ChatGPT

Django笔记十八之save函数的继承操作和指定字段更新等实例方法

Hunter熊

Python django save auto_increment primary key

华为阅读联手20余家头部内容平台,共建数字化阅读

最新动态

性能大PK count(*)、count(1)和count(列)

架构精进之路

MySQL 数据库 后端 innodb 三周年连更

场景篇-ChatGPT帮我搭建博客网站并自动写博客!

Marvin

博客 ChatGPT

音视频八股文(7)-- 音频aac adts

福大大架构师每日一题

音视频 流媒体

如何在 Linux 中查看正在运行的进程?这三个命令轻松实现!

wljslmz

Linux 三周年连更

场景篇-ChatGPT帮我实现发送公众号推文

Marvin

微信公众号 代码生成 ChatGPT

Go 语言中没有枚举类型,但是我们可以这样做

陈明勇

Go golang 枚举 Enum 三周年连更

挑战 30 天学完 Python:Day13 列表推导式和Lambda

MegaQi

挑战30天学完Python 三周年连更

Rack:处理HTTP请求更简单_Ruby_Mirko Stocker_InfoQ精选文章