保持状态并在django请求之间共享通用处理

时间:2016-02-07 19:28:59

标签: django views python-requests state shared

我正在构建一个简单的django应用程序,它从服务中获取数据,处理数据,存储到数据库中,并根据处理的数据提供页面。数据库中的数据是只读的,并显示在静态页面上。

从外部服务初始获取将需要几分钟来填充数据库。我目前的计划是在第一页请求中对服务进行初始长时间提取,并且请求的视图设置一个标记' fetch-in-progress'因此,进一步的请求不会开始另一个不必要的提取。

我假设django同时处理多个请求 - 我只是读了一下,它似乎依赖于wsgi配置。但我假设两个请求将同时由django处理,在我的情况下,它将导致两次提取服务,我想避免。

存放国旗的最佳地点是什么?我读过的选项:

  1. 在数据库中,仅作为标志(Shared object between requests in Django
  2. 的单独表格
  3. 作为从服务提取(Django 1.6 OrderedDict retaining state across requests? or cacheing enabled by default?
  4. 的View类的class属性
  5. Django会话 - 猜测我不能使用它作为来自另一个浏览器的请求将通过一个单独的会话,这将导致不必要的提取。
  6. 低级缓存API(https://docs.djangoproject.com/en/dev/topics/cache/#the-low-level-cache-api) - 在缓存中存储标志 - 文档说"在同一个线程中对同一别名的重复请求将返回相同的对象。" - 我不确定django默认使用相同的线程来处理请求
  7. Django中间件 - 也许在启动时进行初始冗长的获取?

1 个答案:

答案 0 :(得分:0)

您应该使用持久性中央存储,因此即使您有多个具有负载均衡器的服务器,所有服务器都将访问相同的标志。如果在运行时将属性设置为类,则一个服务器将看到该标志,但如果节点平衡器将下一个请求发送到另一个服务器 - 它不会。

具体解决方案基于数据大小,更新频率,预期流量等。通常从数据库中获取单个标志的速度很快,因此您应该考虑是否值得安装和管理中央缓存。如果你使用中央缓存,基于文件的缓存很容易,那么它就变得更加复杂。也许DB会这样做? 你可以让它更快:

  1. 带有少量索引整数列的标志表,因此每个数据库页面都包含很多索引行

  2. 使用直接SQL查询数据库,只是为了获取MySQLDB的标志,并节省了django对象和模型的开销

  3. 使用与所有其他django表单独的数据库。