我一直在研究用EventMachine来处理一些工作的可能性.在Sinatra中,这似乎工作得很好,但Rails 3似乎在渲染视图之前执行所有刻度.
当我在瘦Web服务器下运行以下代码时,它的行为与预期一致.第一个请求立即返回,第二个请求正在等待3秒睡眠呼叫完成.这是预期的行为.
class EMSinatra < Sinatra::Base
get "/" do
EM.next_tick { sleep 3 }
"Hello"
end
end
Run Code Online (Sandbox Code Playgroud)
在Rails 3运行中,我正在尝试做同样的事情:(在瘦下运行)
class EmController < ApplicationController
def index
EM.next_tick {
sleep(3)
}
end
end
Run Code Online (Sandbox Code Playgroud)
在Rails中,睡眠调用在将视图呈现给浏览器之前发生.结果是我等待3秒钟才能渲染初始页面.
有人知道为什么会这样吗?我不是在寻找评论,这是一个好的做法.我只是在试验.将小任务投入反应堆循环似乎是一件值得探讨的事情.如果我要进行一些非阻塞的http请求,为什么客户端必须等待?
我正在开发一个新网站.该网站的复杂程度将在Yelp.com的订单上.我对Ruby很新,但我决定使用它来开发后端.在这个过程中,我偶然发现了Sinatra.我真的很喜欢Sinatra中路由的简单性,并决定将它作为我开发的起点.似乎大多数地方都说Sinatra非常适合快速开发和"小型网络应用程序".Sinatra是否存在固有的扩展问题,还是因为您基本上必须从头开始构建所有内容而产生的评论?任何关于您使用Sinatra作为大型Web应用程序基础的意见的评论将不胜感激.
我不确定stackoverflow是否是提出这样的意见问题的正确位置,但它是我目前拥有的唯一资源,可以实际获得有关此类内容的反馈.
我正在使用我用Sinatra制作的API来构建一个简单的应用程序,它返回一些JSON.这是相当多的JSON,我的应用程序的API依赖于对其他API的几百个请求.
我可以将结果缓存5天左右,根本没有数据问题.我只是不是100%确定如何实现缓存.我如何与Sinatra一起做这件事?
我想在我现有的Sinatra应用程序中添加一个ORM.虽然我还没有尝试过ActiveRecord,但我还是通过了Datamapper,Sequel和ActiveRecord.
Datamapper似乎很容易,但我经常面临" 在一个进程中使用什么ORM多个数据库连接sinatra应用程序? "中讨论的问题,但无法理解它的解决方案和根本原因.
有没有建议选择合适的,以绩效为导向的ORM?
我在寻找一个简单的方法,以使在通过薄独立西纳特拉应用程序运行SSL,而不必通过--ssl,--ssl-key-file并--ssl-cert-file在通过薄命令行参数.
是否可以直接在Sinatra应用程序中或通过config.ru文件定义它们?
我花了几个小时寻找这个问题的答案,但到目前为止还没有找到任何有效的方法.
我一直在读书,我发现这个名为Grape的微框架用于红宝石.我目前正在使用Sinatra来处理Web界面,但我还想实现Grape来处理应用程序的API方面.我找不到任何有用的建议来解决这个问题.葡萄文档说"Grape是一个类似REST的API微框架,用于Ruby.它设计用于在Rack上运行,或通过提供简单的DSL来轻松开发RESTful API,从而补充现有的Web应用程序框架,如Rails和Sinatra." 所以听起来应该有正式的两种方式相结合的方式吗?这个应用程序也将在Heroku上运行.
我正在尝试在我的应用程序中利用Server-Sent Events.我正在使用Sinatra和sinatra-sse宝石.这个宝石包裹着Sinatra的stream :keep_alive召唤.
在Thin上运行我的应用程序时,我绝对没有问题,我的事件流按预期工作.然而,当我切换我的应用程序与Puma一起运行时,一切正常,除了我sse_stream绝对没有!它只返回一个空白页面.
我的流设置如此
get "/logstream/:server" do
if rbcserver = MyApp.servers[params[:server]]
sse_stream do |stream|
rbcserver.add_web_logger(stream)
stream.callback { rbcserver.remove_web_logger(stream) }
end
else
error 404
end
end
Run Code Online (Sandbox Code Playgroud)
我这样开始瘦:
@@puma_instance = Puma::Server.new MyApp::WebUI
@@puma_instance.add_tcp_listener ip, port
@@puma_instance.run
Run Code Online (Sandbox Code Playgroud)
知道发生了什么事吗?任何帮助,将不胜感激.
编辑:更多信息这是cURL在Puma上运行时提供的
$ curl -L -b cookies.txt -c cookies.txt -i http://localhost:9001/logstream/myserver
HTTP/1.1 200 OK
Content-Type: text/event-stream;charset=utf-8
X-Content-Type-Options: nosniff
Transfer-Encoding: chunked
$
Run Code Online (Sandbox Code Playgroud)
而这就是Thin上发生的事情
$ curl -L -b cookies.txt -c cookies.txt -i http://localhost:9001/logstream/myserver
HTTP/1.1 200 OK
Content-Type: text/event-stream;charset=utf-8
X-Content-Type-Options: nosniff
Connection: …Run Code Online (Sandbox Code Playgroud) 我需要Sinatra路由以下列方式运行:
GET /list/20/10 # Get 20 items with offset 10
GET /list/20 # Get 20 items with default offset
GET /list # Get default number of items with default offset
Run Code Online (Sandbox Code Playgroud)
我明白,我可能会将值作为查询传递:
GET /list?limit=20&offset=10
Run Code Online (Sandbox Code Playgroud)
但我想按照上面的描述传递它们.我很确定有一种方法可以向Sinatra/Padrino解释我想做什么,但我现在完全陷入困境.我试过了:
get :list, :map => '/list', :with => [:limit, :offset] {} # 404 on /list
get :list, :map => '/list/*' { puts params[:splat] } # 404 on /list
get :list, :map => '/list/?:limit?/?:offset?' {} # 404 on /list
get :list, :map => '/list' { redirect url_for(:list, …) …Run Code Online (Sandbox Code Playgroud) 使用redirect和redirect to在Sinatra 之间有什么区别?它们似乎都默认为相同的状态代码.是否to '/url'只是一些语法上的好处,使方法更具可读性?
我尝试使用SSL创建POST请求,但没有OpenSSL :: SSL :: VERIFY_NONE,因为它会打开安全攻击并且没有PEM证书.但我发现问题,我发送POST请求的ruby代码:
post '/test/test1' do
cross_origin
post_data = request.body.read
res_Data = JSON.parse(post_data)
userName = res_Data['username']
@responseFromServer=''
uri = URI('https://test.com/test1')
Net::HTTP.start(uri.host, uri.port,
:use_ssl => uri.scheme == 'https',
:verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
request = Net::HTTP::Post.new uri.request_uri
request.basic_auth 'aa', 'bb'
request.body = {'username' =>userName}.to_json
response = http.request request
@responseFromServer = response.body.to_s
end
newJson = JSON.parse(@responseFromServer)
status_msg = newJson['status']['status_msg']
if (status_msg == "Success")
return 'true'
end
return 'false'
end
Run Code Online (Sandbox Code Playgroud)
这是方法工作,但他使用OpenSSL :: SSL :: VERIFY_NONE.如何在没有OpenSSL :: SSL :: VERIFY_NONE和PEM sertificate的情况下创建发送POST请求的方法?
编辑 …