我从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)
答案 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已经设置好了)。