2012-08-14 83 views
5

我正在实现一个非常轻量级的Web项目,它只有一个页面,在图表中显示数据。我使用Django作为Web服务器,并使用d3.js作为此图的绘图例程。正如你可以想象的那样,Django服务器只有几个简单的时间序列,所以我想知道我是否可以在RAM中保存这个变量。我的第一个试验阳性,我在我的views.py是这样的:django vars in ram

X = np.array([123,23,1,32,123,1]) 

@csrf_exempt 
def getGraph(request): 
    global X 
    return HttpResponse(json.dumps(X)) 

通知,X被另一个功能飘飞更新,但所有用户的访问是只读的。我必须处理

  1. 安全问题通过定义一个全局变量?
  2. 一般的不一致?

我发现a thread讨论Django中的全局变量,但在这种情况下,难点在于处理多个写入访问。

要回答潜在的问题,为什么我不想在数据库中存储数据:我在我的X中获得的所有数据都已存储在一个巨大的远程数据库中,并且此Web应用程序只需显示数据。

回答

2

将它存储在变量中确实具有线程影响(还有可扩展性 - 如果您有两个运行相同应用程序的Django服务器?)。来自Django社区的建议是不要

这听起来很适合Django缓存系统。只需缓存您的getGraph视图@cache_page并完成工作。无需使用memcache,内置内存缓存缓存后端*将正常工作。在缓存(年)上放置一个非常高的数字作为超时值。

这样你就可以存储HTTP响应(JSON)而不是X的值。但是从你的代码示例来看,这不是问题。如果您需要重新计算X,你需要重新计算JSON,如果你需要重新计算JSON,您将需要重新计算X.

https://docs.djangoproject.com/en/dev/topics/cache/?from=olddocs/


或者只是'内置内存后端',我忍不住

+0

作为Django社区的成员,我不一定会说“不要” - 我已经做了几件非常类似的事情。但是,对于缓存后端而言,这是解决此问题的更好方法。 – 2012-08-14 11:26:48

+1

@Joe我试过了,它对正常的http请求工作正常,但是当我通过AJAX调用它时,它没有被缓存。我猜,Django认为每一个'AJAX'请求都与之前的不同,并再次计算'X'。如何处理?但是,再次感谢,推荐Django缓存系统 - 它似乎比全球变化更优雅 – 2012-08-14 13:16:10

+1

不介意!我通过使用'低级高速缓存API'解决了这个问题。这很完美。非常感谢 – 2012-08-14 13:27:11