ruby-on-rails Rack中间件中的“env”变量是什么?

xqkwcwgp  于 2023-02-06  发布在  Ruby
关注(0)|答案(5)|浏览(122)

我知道Rack中间件过滤器是一个Ruby类,它有一个initialize和一个call方法,我知道call方法有一个"env"参数,就像这样:

class MyFilter
  def initialize(app)
  end

  def call(env)
  end
end

我的问题是:"env"参数到底是什么被发送到"call"的?2这和Rails的ENV环境(即开发、测试、生产)是一样的吗?
谢谢!

9njqaruj

9njqaruj1#

env只是一个散列,机架本身和各种中间件都在其中添加了价值。
要了解散列中的各种键,请查看Rack Specification
下面是一个示例env散列:

{
  "GATEWAY_INTERFACE" => "CGI/1.1",
  "PATH_INFO" => "/index.html",
  "QUERY_STRING" => "",
  "REMOTE_ADDR" => "::1",
  "REMOTE_HOST" => "localhost",
  "REQUEST_METHOD" => "GET",
  "REQUEST_URI" => "http://localhost:3000/index.html",
  "SCRIPT_NAME" => "",
  "SERVER_NAME" => "localhost",
  "SERVER_PORT" => "3000",
  "SERVER_PROTOCOL" => "HTTP/1.1",
  "SERVER_SOFTWARE" => "WEBrick/1.3.1 (Ruby/2.0.0/2013-11-22)",
  "HTTP_HOST" => "localhost:3000",
  "HTTP_USER_AGENT" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0",
  "HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
  "HTTP_ACCEPT_LANGUAGE" => "zh-tw,zh;q=0.8,en-us;q=0.5,en;q=0.3",
  "HTTP_ACCEPT_ENCODING" => "gzip, deflate",
  "HTTP_COOKIE" => "jsonrpc.session=3iqp3ydRwFyqjcfO0GT2bzUh.bacc2786c7a81df0d0e950bec8fa1a9b1ba0bb61",
  "HTTP_CONNECTION" => "keep-alive",
  "HTTP_CACHE_CONTROL" => "max-age=0",
  "rack.version" => [1, 2],
  "rack.input" => #<StringIO:0x007fa1bce039f8>,
  "rack.errors" => #<IO:<STDERR>>,
  "rack.multithread" => true,
  "rack.multiprocess" => false,
  "rack.run_once" => false,
  "rack.url_scheme" => "http",
  "HTTP_VERSION" => "HTTP/1.1",
  "REQUEST_PATH" => "/index.html"
}

为了使它更易于使用, checkout Rack::Request,这使得访问env散列中的值更容易。

vawmfj5a

vawmfj5a2#

我建议你可以尝试用写一个简单的编程来打印'env'变量。

require "rubygems"
require "rack" 
def pp(hash)
  hash.map {|key,value| "#{key} => #{value}"}.sort.join("<br/>") 
end
Rack::Handler::WEBrick.run lambda {|env| [200,{},[pp(env)]]} , :Port=>3000

输入链接本地主机:3000

monwx1rj

monwx1rj3#

env变量是一个哈希值,它包含了很多有用的信息,包括请求头和请求体,以及可能由上游中间件添加的运行时环境数据。

wdebmtf2

wdebmtf24#

看看source code,根据你使用的web服务器,你可以在你的env哈希中得到不同的值,我建议 * 只 * 使用documentation中的值。
env基本上是web服务器特有的request对象的散列版本,Rack做了一些工作来给予一个规范化的env,这样中间件就可以在不同的web服务器上保持一致的行为。

syqv5f0l

syqv5f0l5#

我知道这是一个老问题。
然而,我会努力帮助即将到来的ROR开发人员。
在Rack中间件中,env变量是一个哈希值,它保存了环境和传入HTTP请求的详细信息,包括请求方法、路由、头和其他数据。
call函数是处理Rack应用程序中传入请求的主要入口点,这就是为什么在中间件中放置def call(env)时可以访问env散列的原因。当基于Rack的应用程序接收到请求时,会将请求发送给顶部Rack组件的call方法。
在此方案中,env散列是作为call函数的参数提供的,因为您要创建的是作为Rack堆栈组件的唯一中间件。call方法可以读取和修改env散列中的数据,其中包括有关环境和传入请求的信息,以便处理请求。
我建议看看这个教程:link以了解有关env变量及其在Rack中间件中的功能的更多信息。
本课将详细介绍env变量,沿着各种机架堆栈组件如何使用和修改该变量。

相关问题