Sinatra 的请求 object 何时何地存在?

When and where does Sinatra's request object exist?

我很困惑,我已经尝试了所有我能想到的方法来解决这个问题,但我一无所获。

Sinatra 的请求 object 何时开始存在?它实际存在于何处?我如何从任何地方访问它?例如,另一个 class 继承自 class,后者继承自 class,后者继承自 Sinatra::Base

我已经设法从 this question 那里了解到它存在的位置,但我似乎无法进一步了解。 我尝试过的事情:

def self.request
   self.superclass.superclass.superclass.request
end

使用`instance_eval 或使用:

更改代码执行上下文的各种方法
def self.method_added method_name
  a = self.new.method(method_name)
    def self.define_method method_name do
      a.call
    end
end 

以及我能想到的任何其他内容,但无论我做什么,request 始终为零,因此我再次询问,请求 object 在请求期间何时何地出现?

编辑:

无意冒犯,但很难说出我在问什么?

问题来了,就是标题中的:

When and where does Sinatra's request object exist?

Sinatra 有一个请求 object,object 什么时候开始存在? (比如在代码执行期间它什么时候不为零?)

它什么时候存在,它存在于什么地方,在 Sinatra::Base 一个 Sinatra::Base 的实例中还是在 `Wrapper 中或其他什么地方?

编辑:

这是我正在做的事情:

在这个例子中:

r[:action] 是 'get'

r[:url] 是 '/'

methodget_root

instance 是一个存储 self.new 的变量,因此我可以访问任何实例方法。

            def method_added method
                return if Delegation::SIN_DSL[:basic].include?(method)
                r,p = get_r_data method
                m = self.instance.method(method)
                self.send r[:action], r[:url].first, (@options || {}) do         
                    (m.arity < 1 ) ?  m.call : m.call(*p)                                      
                end
                @options = nil

            end

sinatra 应用程序是机架应用程序。如果你有

class MyApp < Sinatra::Base
end

那么 MyApp class 的实例化位置取决于您如何启动运行它的网络服务器;一般来说,机架处理程序(根据您使用的 http 服务器可能有不同的类型)将存储 sinatra 应用程序的实例。当机架请求进入时,服务器或另一个机架应用程序将 call 具有机架环境哈希的应用程序实例。 Sinatra::Base#call 然后会做 dup.call!(env), meaning that a shallow copy of the existing instance is made and then call! is invoked on the copy. The body of call! 是初始化请求对象的地方:

def call!(env) # :nodoc:
  @env      = env
  @request  = Request.new(env)

当您在路由处理程序中引用 request 时,您通常会调用此实例变量的 request 访问器。

不确定这是否对您有帮助,但它至少应该回答了问题。

警告:答案对 sinatra v1.4.5 有效,但您不应期望它保持有效。这些实现细节不是 public sinatra API 的一部分,并且没有记录是有原因的——你不打算搞砸它,如果你升级,这样做很可能会破坏你的应用程序西纳特拉版本。我不建议编写依赖于这些细节的代码。