Django管理员自定义操作请求

时间:2018-08-09 20:10:35

标签: django http

我编写了一个自定义操作,并通过模型权限将这些权限授予了2个用户。

但是现在我只希望其中之一可以随时运行它。因此,无论他们何时选择 n 0 {'truth': 185.179993, 'day1': 197.223077530388... 并按操作按钮,它都会检查是否已经制作了actionbox

所以我的问题是,在将用户带到中介页面并显示消息之前,是否可以询问其他request.POST个请求?但无需挖掘服务器日志。

1 个答案:

答案 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