Python 有没有办法检查Django管理命令是否正在运行?
视图依赖于要填充的Redis。Redis由每10分钟运行一次的管理命令填充。此管理命令删除所有现有密钥,并使用新数据重新添加它们。如何确定管理命令是否从django视图运行Python 有没有办法检查Django管理命令是否正在运行?,python,django,Python,Django,视图依赖于要填充的Redis。Redis由每10分钟运行一次的管理命令填充。此管理命令删除所有现有密钥,并使用新数据重新添加它们。如何确定管理命令是否从django视图运行 现在,我让管理命令写入一个外部文件,并让视图在每次请求时读取该文件。如果通过管理命令刷新数据库,我将保留视图,直到它完成(轮询样式)。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)
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将以原子方式执行增量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)
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的文件