【问题标题】:Django not inserting data into database when I execute subprocess.Popen当我执行 subprocess.Popen 时,Django 没有将数据插入数据库
【发布时间】:2017-11-07 04:48:06
【问题描述】:

我正在使用 django 并将数据插入数据库并下载图像。当我调用该函数时,它工作正常,但它阻塞了主线程。要在我正在使用的后台执行该过程:

views.py:

类 get_all_data(查看): 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 时,它不会将数据插入到我的数据库中,但如果我通过调用函数执行它,那么它将数据插入到数据库中。为什么会这样?

【问题讨论】:

  • python get_images.py(data="data") 你用的是什么外壳?这绝对是bash下的语法错误。
  • Celery 异步运行任务的方式。你为什么不想使用它?
  • @freakish 我以这种方式调用该方法,而不是使用 shell:python get_images.py(data="data")。 )只有带有 Popen 的代码在 shell 中。
  • 显示get_images.py 的内容我怀疑你使用的东西只有在 Django 上下文中执行时才会运行(例如导入模型)
  • @bakkal 很抱歉我在错误的文件下添加了代码。我已经更新了所有更改。请看一下:)

标签: python django subprocess


【解决方案1】:
  • 一、导入和使用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
)

【讨论】:

  • 我现在收到此错误:raise AppRegistryNotReady("Apps are not loaded yet.") django.core.exceptions.AppRegistryNotReady: Apps are not loaded yet.
【解决方案2】:

不应该

subprocess.Popen(
            ['python get_images.py(data=data)'],
            close_fds=True,
            shell = True
        )

【讨论】:

    猜你喜欢
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多