我正在使用 django 并将数据插入数据库并下载图像。当我调用该函数时,它工作正常,但它会阻塞主线程。要在后台执行该进程,我正在使用:
views.py:
类 get_all_data( View ): def post(self, request, *args, **kwargs):
subprocess.Popen(
['python get_images.py --data=data'],
close_fds=True,
shell = True
)
但是当我打电话时:
python get_images.py(data="data")
它工作正常,但它在主线程上运行。
我该如何修复它?顺便说一句,我正在使用 python 2.7。
注意:请不要推荐 Celery 。我正在寻找运行异步任务或任何其他替代方案的东西。
我使用以下代码插入我的数据库:
get_images.py:
from models import Test
def get_image_all():
#get data from server
insert_to_Test(data="data")
if __name__ == "__main__":
import argparse
from .models import Test
import django
django.setup()
parser = argparse.ArgumentParser()
parser.add_argument('--from_date')
parser.add_argument('--data')
parser.add_argument('--execute', type=bool, default=False)
args = parser.parse_args()
print "args", args
get_image_all(**vars(args))
当我调用 subprocess.Popen 时,它不会将数据插入到我的数据库中,但如果我通过调用该函数来执行它,那么它会将数据插入到数据库中。为什么会发生这种情况?
最佳答案
- 首先,导入并使用 Django 模型之后
django.setup()
- 其次,确保spawn进程运行的环境正确,主要是确保在正确的virtualenv中使用正确的Python解释器(如果使用的话),并确保进程运行在正确的工作目录
示例代码:
if __name__ == "__main__":
import argparse
import django
django.setup()
from .models import Test
# Parse args
# Use Django models
接下来,您需要确保 subprocess
在正确的工作目录中运行,并激活您的 Python virtualenv(如果有),大致如下所示:
subprocess.Popen(
'/path/to/virtualenv/bin/python get_images.py --data=data',
cwd='/path/to/project/working_directory/',
shell=True
)
关于python - 当我执行 subprocess.Popen 时,Django 没有将数据插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44385427/