我编写了一个自定义操作,并通过模型权限将这些权限授予了2个用户。
但是现在我只希望其中之一可以随时运行它。因此,无论他们何时选择 n
0 {'truth': 185.179993, 'day1': 197.223077530388...
并按操作按钮,它都会检查是否已经制作了actionbox
。
所以我的问题是,在将用户带到中介页面并显示消息之前,是否可以询问其他request.POST
个请求?但无需挖掘服务器日志。
答案 0 :(得分:0)
要退后一步,我认为您真正要问的是如何跨应用程序的入口点共享数据。例如如果您只希望1个人能够一次触发一个按钮上的操作。
执行此操作的一种策略是获取一些可在部署范围内访问的数据存储(例如,缓存或部署的所有实例都可以访问的消息队列),并在其中放入一条类似于锁的消息。这将依赖于该数据存储来支持原子读取和写入。在Django中,像redis或memcached之类的东西可以很好地用于此目的(特别是如果您将其用作缓存后端)。
您可能会有类似以下内容的示例(取自celery文档的示例):
from datetime import datetime, timedelta
from django.core.cache import cache
from contextlib import contextmanager
LOCK_EXPIRE = 600 # Let the lock timeout in case your code crashes.
@contextmanager
def memcache_lock(lock_id):
timeout_at = datetime.now() + timedelta(seconds=LOCK_EXPIRE)
# cache.add fails if the key already exists
status = cache.add(lock_id, 'locked', LOCK_EXPIRE)
try:
yield status
finally:
if datetime.now() < timeout_at and status:
# don't release the lock if we exceeded the timeout
# to lessen the chance of releasing an expired lock
# owned by someone else
# also don't release the lock if we didn't acquire it
cache.delete(lock_id)
def my_custom_action(self, *args, **kwargs):
lock_id = "my-custom-action-lock"
with memcache_lock(lock_id) as acquired:
if acquired:
return do_stuff()
else:
do_something_else_if_someone_is_already_doing_stuff()
return