用户会话的持久性决策

时间:2014-02-04 18:40:13

标签: python django

我正在为我的Django应用程序中的登录失败尝试实施一个计数器。 此计数器基于外部用户的IP地址,只要服务器运行,我需要将此计数器保留在内存中。

据我所知,我不能使用当前会话来存储它,因为这可以很容易地删除,甚至可以从客户端进行编辑。

我尝试向我的应用的__init__.py添加一些词组,如:

WATCHED_IP_ATTEMPTS = {}
BLOCKED_IPS = {}

但我对此有一些奇怪的行为:

  • 如果我将应用程序闲置一段时间似乎会重启
  • 我看不到来自app shell的电流,它们总是空的

如果有人可以指出更好的方法来做到这一点或我错过了什么,我会很高兴...


修改

很抱歉误会...... 我所谈论的持久性就在服务器运行时。

我现在明白应该使用数据库进行持久化。 但仅仅是为了问题,是否有任何地方可以轻松存储这样的数据?就像当前正在运行的应用中的属性一样?

2 个答案:

答案 0 :(得分:1)

从根本上说,这就是数据库或其他一些外部数据存储的用途。您需要配置像Postgres这样的数据库或像redis这样的内存数据存储,以便以结构化的方式为您存储这些信息。

这样做的原因是Django应用程序不应该按照设计在会话之间保留任何信息。 Django应用程序可以同时在多个进程和多个服务器上运行,因此需要将应用程序配置为访问外部数据存储,以便可以在Web应用程序进程之间共享这样的工作。

没有其他正确的方法可以做到这一点 - 例如,将文件直接写入磁盘不适用于并发访问,这是任何规模的任何网站的要求(特别是如果您正在处理安全相关的功能)。

您更新的问题的答案是"否"。由于上述原因,没有。我并不是说它根本不可能,但它不是制作这种软件的正确方法,所以框架不会让你感到轻松。

答案 1 :(得分:0)

您的应用很可能在重启时丢失这类数据,甚至在两个请求之间丢失(取决于您当时正在运行什么类型的服务器)。

但是既然你需要数据是持久的,为什么不把它粘在数据库中呢?或者,如果您希望在某种内存存储中快速处理它。 Memcache或redis应该对这个用例做得很好。 Redis甚至可以为您提供存储集等内容,这有助于BLOCKED_IPS查找。