Django从另一个进程访问数据库

时间:2017-11-08 16:45:48

标签: python django database multiprocessing

我从django app创建了一个新的Process。我可以通过此流程在数据库中创建新记录吗? 我的代码抛出异常:

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)

2 个答案:

答案 0 :(得分:1)

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

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

myproject.settings需要在此代码运行时可导入,因此如果不是,您可能需要先添加到sys.path

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

答案 1 :(得分:0)

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

所指示的解决方案是在新流程之前关闭数据库连接,因此,当新流程中需要查询时,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已经设置好了)。