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]
是 '/'
method
是 get_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 的一部分,并且没有记录是有原因的——你不打算搞砸它,如果你升级,这样做很可能会破坏你的应用程序西纳特拉版本。我不建议编写依赖于这些细节的代码。
我很困惑,我已经尝试了所有我能想到的方法来解决这个问题,但我一无所获。
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]
是 '/'
method
是 get_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 的一部分,并且没有记录是有原因的——你不打算搞砸它,如果你升级,这样做很可能会破坏你的应用程序西纳特拉版本。我不建议编写依赖于这些细节的代码。