为每个请求创建新的 sinatra 对象,但初始化只调用一次
New sinatra object for every requests but initialize only called once
我通过以下脚本创建了一个非常简单的网络服务器:
require 'sinatra'
class MyApp < Sinatra::Base
def initialize(app = nil)
super(app)
puts "******** constructing myapp **********"
end
get '/' do
return "object id: #{object_id}, class #{self.class}"
end
end
MyApp.run!
如果我 运行 这个小网络服务器然后第一次调用 wget -q -O - http://localhost:4567
,我会在我的控制台 运行 宁我的服务器中看到这个:
******** constructing myapp **********
127.0.0.1 - - [28/Jan/2017:16:47:39 EST] "GET / HTTP/1.1" 200 31
- -> /
wget 打印:
object id: 10454240, class MyApp
正如预期的那样,在第一次调用时,创建了一个 MyApp 对象并调用了 initialize
。
然后,如果我再次调用 wget -q -O - http://localhost:4567
,我会看到:
127.0.0.1 - - [28/Jan/2017:16:49:11 EST] "GET / HTTP/1.1" 200 31
- -> /
wget 的输出打印如下:
object id: 9387860, class MyApp
因此,在第二次调用时,我有一个不同的 MyApp 实例(因为 object_id 与第一次调用时的值不同)但是 initialize
未被调用。如何创建一个新对象并绕过对 initialize
的调用?
为每个 request.The 实例创建一个新的 class 与 Sinatra::Application.new
无关,但与 Sinatra::Application.prototype.dup
相关,这就是为什么 initialize
不是每次都调用的原因.看
document link
获取代码。
我通过以下脚本创建了一个非常简单的网络服务器:
require 'sinatra'
class MyApp < Sinatra::Base
def initialize(app = nil)
super(app)
puts "******** constructing myapp **********"
end
get '/' do
return "object id: #{object_id}, class #{self.class}"
end
end
MyApp.run!
如果我 运行 这个小网络服务器然后第一次调用 wget -q -O - http://localhost:4567
,我会在我的控制台 运行 宁我的服务器中看到这个:
******** constructing myapp **********
127.0.0.1 - - [28/Jan/2017:16:47:39 EST] "GET / HTTP/1.1" 200 31
- -> /
wget 打印:
object id: 10454240, class MyApp
正如预期的那样,在第一次调用时,创建了一个 MyApp 对象并调用了 initialize
。
然后,如果我再次调用 wget -q -O - http://localhost:4567
,我会看到:
127.0.0.1 - - [28/Jan/2017:16:49:11 EST] "GET / HTTP/1.1" 200 31
- -> /
wget 的输出打印如下:
object id: 9387860, class MyApp
因此,在第二次调用时,我有一个不同的 MyApp 实例(因为 object_id 与第一次调用时的值不同)但是 initialize
未被调用。如何创建一个新对象并绕过对 initialize
的调用?
为每个 request.The 实例创建一个新的 class 与 Sinatra::Application.new
无关,但与 Sinatra::Application.prototype.dup
相关,这就是为什么 initialize
不是每次都调用的原因.看
document link
获取代码。