Ruby Sinatra中公共目录中的布局(使用相同布局缓存文件)

Ruby Sinatra中公共目录中的布局(使用相同布局缓存文件),ruby,caching,layout,sinatra,Ruby,Caching,Layout,Sinatra,我想把文件放在public dir中,但我想给它们一个布局,因为很多文件都有相同的布局。这可能吗?我之所以要这样做,是因为我希望它们能够以最快的速度提供,每次都不渲染。对于最快的速度,您希望使用布局和视图预生成输出,并将它们保存为公共目录中的静态文件。例如,如果您使用Haml作为模板语言,那么它有一个生成HTML输出的命令行版本 或者: 使用图书馆 阅读这些关于缓存的文章 检查您的主机是否安装了Varnish Cache,在Sinatra中,您只需发送一个“Cache control”(缓存控

我想把文件放在public dir中,但我想给它们一个布局,因为很多文件都有相同的布局。这可能吗?我之所以要这样做,是因为我希望它们能够以最快的速度提供,每次都不渲染。

对于最快的速度,您希望使用布局和视图预生成输出,并将它们保存为公共目录中的静态文件。例如,如果您使用Haml作为模板语言,那么它有一个生成HTML输出的命令行版本

或者:

  • 使用图书馆
  • 阅读这些关于缓存的文章

检查您的主机是否安装了Varnish Cache,在Sinatra中,您只需发送一个“Cache control”(缓存控制)头,您的应用程序服务器只会被请求命中一次:

get '/rendered_page/:which_page' do 
  response.headers['Cache-Control'] = 'public, max-age=300'
  haml :"pages/#{params[:which_page]"
end
然后将页面放入带有.haml扩展名的“视图/页面”中

在第一个请求中,Varnish没有应该提供什么的记录,因此您的应用程序生成完整的HTML。后续请求不会到达您的应用程序,因为Varnish会发回以前请求中的内容


例如,Heroku默认提供清漆:

谢谢!我也在用Heroku。1) 如何无限期缓存页面并防止用户(按下Shift+refresh)导致重新生成?2) 你给出的Heroku链接说,“[缓存]可能会对应用程序的性能造成短暂的影响,特别是对静态资产的服务,在更改完成后第一个访问该站点的用户。”我如何通过确保新页面在服务之前已在缓存中来防止这种情况?我想解决这两个问题,因为它们会降低性能,而不会给用户带来任何好处,而且,静态页面不存在这些问题。谢谢1.您可以将“最大年龄”调整为非常大,但是每次重新部署应用程序时,清漆缓存都会被擦除。Shift refresh对varnish没有影响-它们仍然会得到缓存的页面。它是服务器端缓存,而不是客户端缓存。2.我真的不担心这一点——与这种轻微的减速相比,你节省的钱是巨大的。您可以编写一个“tickle脚本”,在git post deploy钩子中运行,该钩子访问许多常见页面。Varnish为最终用户带来了巨大的好处-与通过ruby提供相同的页面相比,您每秒可以获得更多的页面。谢谢!如果更新后的页面自动写入Varnish,那么即使是第一个访问页面的用户也不会得到延迟,这将是一件好事。不管怎样,我读了,它看起来很不错。我可以设置Varnish,用缓存的页面响应POST请求吗?我之所以这么问,是因为Facebook向一个带有POST请求的应用程序发出了初始请求。Facebook也会发送一个签名的请求参数和这个POST请求。是否也可以使用Sinatra处理此已签名的_请求参数,并将cookie与缓存页面一起发送回?页面总是相同的,但是cookie(因此HTTP响应头)每次都不同。也就是说,页面不必每次都由ERB构建,因为它总是一样的,但它确实使用了ERB模板的功能&varsAFAIK,你不能用Varnish缓存帖子。但您可以尝试将重定向“/something\u static”作为响应,然后在其上发送缓存响应-但我不相信您能够注入该头。这还取决于Facebook的代码是否遵循重定向。如果您担心这里的响应性,可以渲染一次结果并将其放入Memcache,然后只返回缓存的结果,而不是每次渲染。看看dalli gem:memcache是Heroku的免费附加组件。