Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有办法检查Django管理命令是否正在运行?_Python_Django - Fatal编程技术网

Python 有没有办法检查Django管理命令是否正在运行?

Python 有没有办法检查Django管理命令是否正在运行?,python,django,Python,Django,视图依赖于要填充的Redis。Redis由每10分钟运行一次的管理命令填充。此管理命令删除所有现有密钥,并使用新数据重新添加它们。如何确定管理命令是否从django视图运行 现在,我让管理命令写入一个外部文件,并让视图在每次请求时读取该文件。如果通过管理命令刷新数据库,我将保留视图,直到它完成(轮询样式)。Django不提供预打包的方法来检查管理命令是否正在运行。也就是说,在等待某个结果时,您不应该编写显式阻止视图的代码。您可以轻松地使用运行应用程序的服务器提供给应用程序的所有线程和进程。你的用

视图依赖于要填充的Redis。Redis由每10分钟运行一次的管理命令填充。此管理命令删除所有现有密钥,并使用新数据重新添加它们。如何确定管理命令是否从django视图运行


现在,我让管理命令写入一个外部文件,并让视图在每次请求时读取该文件。如果通过管理命令刷新数据库,我将保留视图,直到它完成(轮询样式)。

Django不提供预打包的方法来检查管理命令是否正在运行。也就是说,在等待某个结果时,您不应该编写显式阻止视图的代码。您可以轻松地使用运行应用程序的服务器提供给应用程序的所有线程和进程。你的用户在你的网站上会有很差的体验,即使是那些没有做任何与你试图解决的问题有关的事情的用户

我从您的描述中得到的是,您希望用户获得合理的新结果。对于这种情况,我会使用基于数据的解决方案。它是这样的:

  • settings.py
    文件中声明一个支持Redis的缓存,该缓存将包含由命令填充并由视图读取的数据。确保缓存的
    超时设置为
    NONE

  • 使用键
    current\u version
    记录当前版本号。这把钥匙本身没有版本

  • 当命令刷新缓存中的数据时,它将其存储在版本设置为
    当前版本+1
    的密钥中。您将得到类似于:

    current_version = cache.get(CURRENT_VERSION)
    
    # Record the new data.
    for ...:
        cache.set(some_key, some_value, version=current_version + 1)
    
  • Django的缓存系统不允许获取与特定标准对应的一组密钥。但是,您的视图需要获取属于特定版本的所有密钥。该信息可记录为:

    cache.set(ALL_RECORDS, 
              [... list of keys set in the loop above ...], 
              version=current_version + 1)
    
    其中
    所有\u记录
    是一个键值,保证不会与
    当前\u版本
    或为单个记录设置的任何键值冲突

  • 命令完成后,它会自动增加当前版本的值:

    cache.incr(CURRENT_VERSION)
    
    current_version = cache.get(CURRENT_VERSION)
    
    Redis后端上的文档说明,如果您对适当的值执行增量(这一点很模糊,但整数似乎是适当的),那么Redis将以原子方式执行增量

  • 该命令还应清除缓存中的旧版本。确保旧数据不会保留在缓存中的一种方法是在设置键的值时设置键的过期时间。刷新缓存的命令每10分钟运行一次。因此,您将密钥设置为在15分钟后过期。但假设有一个问题阻止了多次运行该命令。然后呢?您的数据将过期并从缓存中删除,视图将使用空数据集运行。如果这对您的情况合适,那么我想您可以在每次执行
    cache.set
    时设置
    timeout
    参数,但
    CURRENT\u VERSION
    应该永远不会过期

    如果您不同意视图使用空数据集运行(在我看来更可能),那么您必须在命令中编写代码以查找旧版本并显式删除它们

  • 您的视图通过以下方式访问缓存:

  • 读取当前版本的值:

    cache.incr(CURRENT_VERSION)
    
    current_version = cache.get(CURRENT_VERSION)
    
  • 正在读取其获得的版本中的记录列表:

    keys = cache.get(ALL_RECORDS, version=current_version)
    
  • 处理记录:

    for key in keys:
        value = cache.get(key, version=current_version)
    
  • 视图应该检测缓存未初始化且正常失败的情况。部署应用程序时,应注意在访问站点之前,命令至少运行一次


    如果在命令更新缓存时视图开始工作,则无所谓。从命令的角度来看,缓存只是在访问以前的版本。从视图的角度来看,命令正忙于创建下一个版本,但视图对此不可见。视图不必阻塞。

    Django不提供预打包的方法来检查管理命令是否正在运行。也就是说,在等待某个结果时,您不应该编写显式阻止视图的代码。您可以轻松地使用运行应用程序的服务器提供给应用程序的所有线程和进程。你的用户在你的网站上会有很差的体验,即使是那些没有做任何与你试图解决的问题有关的事情的用户

    我从您的描述中得到的是,您希望用户获得合理的新结果。对于这种情况,我会使用基于数据的解决方案。它是这样的:

  • settings.py
    文件中声明一个支持Redis的缓存,该缓存将包含由命令填充并由视图读取的数据。确保缓存的
    超时设置为
    NONE

  • 使用键
    current\u version
    记录当前版本号。这把钥匙本身没有版本

  • 当命令刷新缓存中的数据时,它将其存储在版本设置为
    当前版本+1
    的密钥中。您将得到类似于:

    current_version = cache.get(CURRENT_VERSION)
    
    # Record the new data.
    for ...:
        cache.set(some_key, some_value, version=current_version + 1)
    
  • Django的缓存系统不允许获取与特定标准对应的一组密钥。但是,您的视图需要获取属于特定版本的所有密钥。该信息可记录为:

    cache.set(ALL_RECORDS, 
              [... list of keys set in the loop above ...], 
              version=current_version + 1)
    
    其中
    所有\u记录
    是一个键值,保证不会与
    当前\u版本
    或为单个记录设置的任何键值冲突

  • 命令完成后,它会自动增加当前版本的值:

    cache.incr(CURRENT_VERSION)
    
    current_version = cache.get(CURRENT_VERSION)
    
    关于Re的文件