html – 在Sinatra请求之间共享Ruby变量

html – 在Sinatra请求之间共享Ruby变量,第1张

概述我正在尝试在sinatra中编写一个简单的问答游戏,我需要为所有用户提供可访问的公共对象(大厅状态,聊天消息等).问题是Sinatra在每个请求和对象变为初始状态后重新加载代码.怎么实现呢? 好吧,这个话题有点棘手. Sinatra实际上没有重置服务器状态: require 'sinatra'GlobalState = {}GlobalState[:some_counter] = 0ge 我正在尝试在sinatra中编写一个简单的问答游戏,我需要为所有用户提供可访问的公共对象(大厅状态,聊天消息等).问题是Sinatra在每个请求和对象变为初始状态后重新加载代码.怎么实现呢?解决方法 好吧,这个话题有点棘手. Sinatra实际上没有重置服务器状态:

require 'sinatra'GlobalState = {}GlobalState[:some_counter] = 0get '/' do  response = "GlobalState[:some_counter]: #{GlobalState[:some_counter]}"  GlobalState[:some_counter] += 1  responseend

这段代码没有错:如果你运行它并转到http:// localhost:4567,你会看到GlobalState [:some_counter]按预期增加.

但由于以下原因而不鼓励,主要与应用程序的Web性质有关:

>由于数据存储在Ruby对象中,因此如果停止服务器,则会丢失数据.但是,如果您不需要持久数据,那么这不是问题
>运行Web应用程序时,通常会同时拥有应用程序实例,以便同时处理多个请求.有几种方法可以实现它:

> Forks:同一应用程序的多个进程.它们不共享内存,因此Ruby全局状态变量变得无用
>线程:线程共享内存,因此您可以访问全局状态,但是您必须管理对同一个全局对象的并发访问,并带来非常重要的后果

>您无法将数据与用户关联,反之亦然:这是因为http不提供状态保留方法(它是stateless protocol).要解决它,您需要:

>客户端数据存储:cookies,HTML5本地存储……
>服务器端数据存储:会话(不仅仅是服务器端,至少需要将会话关联到相应的客户端,通常将会话ID存储到cookie中)

出于这些原因,Web应用程序数据管理并非易事.无论如何不要担心,你不必重新发明轮子;解决方案在手:

> Sinatra cookies用于客户端数据存储
> Sinatra sessions用于客户端 – 服务器数据共享>数据持久性数据库

总结

以上是内存溢出为你收集整理的html – 在Sinatra请求之间共享Ruby变量全部内容,希望文章能够帮你解决html – 在Sinatra请求之间共享Ruby变量所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1086093.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存