【问题标题】:Django access to database from another processDjango从另一个进程访问数据库
【发布时间】:2017-11-08 16:45:48
【问题描述】:

我从 django 应用程序创建了一个新进程。我可以从这个过程中在数据库中创建新记录吗? 我的代码抛出异常:

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

UPD_1

    def post(self, request):
       v = Value('b', True)
       proc = Process(target=start, args=(v, request.user, 
       request.data['stock'], request.data['pair'], '1111'))

       proc.start()

    def start(v, user, stock_exchange, pair, msg):
       MyModel.objects.create(user=user, stock_exchange=stock_exchange, pair=pair, date=datetime.now(), message=msg)

【问题讨论】:

  • 如果你已经正确初始化它我猜是的。通常manage.py 会执行所有启动操作,但在这里您需要手动进行。
  • 你能展示你的代码吗?

标签: python django database multiprocessing


【解决方案1】:

您需要先初始化项目。通过 manage.py 时通常不必这样做,因为它会自动执行此操作,但新进程不会为此完成此操作。因此,您需要在代码顶部添加如下内容:

import django
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
django.setup()

myproject.settings 需要可从运行此代码的任何位置导入,因此如果不是,您可能需要先添加到 sys.path

完成此操作后,您可以访问项目的模型,并使用它们访问您的数据库,就像您通常那样。

【讨论】:

  • 我从我的角度开始了一个新的过程。将您的代码添加到 proc func 顶部后,什么也没发生
【解决方案2】:

我遇到了类似的问题(也从视图开始),最终帮助我解决的问题是this answer

指示的解决方案是在您fork新进程之前关闭您的数据库连接,以便 Django 可以在新进程中需要查询时重新创建连接。适应你的代码是:

def post(self, request):
   v = Value('b', True)

   #close db connections here
   from django import db
   db.connections.close_all()

   #create and fork your process
   proc = Process(target=start, args=(v, request.user, 
   request.data['stock'], request.data['pair'], '1111'))

   proc.start()

在我的情况下,调用django.setup() 并没有帮助,在阅读了链接的答案之后,可能是因为分叉进程已经共享其父进程的文件描述符等(所以 Django 已经设置好了)。

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    相关资源
    最近更新 更多