跨用户会话的持久dict

2024-04-19 10:45:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在Django应用程序中为不成功的登录尝试实现一个计数器。 此计数器基于外部用户的ip地址,只要服务器运行,我就需要将此计数器保留在内存中。你知道吗

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

我尝试在我的应用程序的__init__.py中添加一些dict,比如:

WATCHED_IP_ATTEMPTS = {}
BLOCKED_IPS = {}

但我有一些奇怪的行为:

  • 如果我让应用程序闲置一段时间,它似乎会重新启动
  • 我看不到应用程序外壳中的电流,它们总是空的

我很高兴如果有人能指出一个更好的方法来做这件事或什么我错过了。。。你知道吗


编辑

抱歉误会了。。。 我刚才说的持久性就是在服务器运行时。你知道吗

我现在明白了持久化应该通过数据库来完成。 不过,就为了这个问题,有没有地方可以方便地存储这样的数据?像当前运行的应用程序中的属性?


Tags: django内存用户pyip服务器应用程序编辑
2条回答

你的应用程序很可能会在重启时,甚至在两个请求之间丢失此类数据(当然,这取决于你运行它的服务器类型)。你知道吗

但是既然您需要数据是持久的,为什么不直接将其粘贴到数据库中呢?或者,如果你想让它处理得很快,在某种内存存储中。Memcache或redis对于这个用例应该做得很好。Redis甚至可以为您提供存储集之类的功能,这将有助于BLOCKED_IPS查找。你知道吗

基本上,这就是数据库或其他外部数据存储的用途。您需要配置Postgres之类的数据库或redis之类的内存数据存储来以结构化的方式为您存储这些信息。你知道吗

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

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

你最新问题的答案是“不”。由于上述原因,没有。我并不是说这实际上是不可能的,但这不是制作这种软件的正确方法,所以框架不会让你轻松。你知道吗

相关问题 更多 >