Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 芹菜工人未从Django应用程序继承设置_Python_Django_Celery - Fatal编程技术网

Python 芹菜工人未从Django应用程序继承设置

Python 芹菜工人未从Django应用程序继承设置,python,django,celery,Python,Django,Celery,我正在开发一个django应用程序,它必须处理用户上传的大型电子表格——所以我自然而然地转向芹菜和rabbitmq。我成功地设置了环境,并且任务在后台成功完成,除了一个问题:我在db router类中使用了几个环境变量(在我的apache vhost文件中定义,并由mod_wsgi传递给django),以确定要使用哪个数据库(即生产vs staging vs dev): 在普通的django线程中运行良好;但是,当后台任务尝试使用db路由器时,我得到以下关键错误(这似乎意味着工作线程无法使用os

我正在开发一个django应用程序,它必须处理用户上传的大型电子表格——所以我自然而然地转向芹菜和rabbitmq。我成功地设置了环境,并且任务在后台成功完成,除了一个问题:我在db router类中使用了几个环境变量(在我的apache vhost文件中定义,并由mod_wsgi传递给django),以确定要使用哪个数据库(即生产vs staging vs dev):

在普通的django线程中运行良好;但是,当后台任务尝试使用db路由器时,我得到以下关键错误(这似乎意味着工作线程无法使用
os.environ
字典):

我试图通过将以下内容添加到我的settings.py文件来修复此问题:

ENVIRONMENT_NAME = os.environ.get('BH_ENVIRONMENT_NAME')
并更新db路由器以使用
设置.ENVIRONMENT\u NAME
——但是,当我在芹菜工人终端中打印出来时,它是空白的。我的芹菜.py文件如下(不确定是否相关):


所以问题是:如何将apache vhost变量传递给芹菜工作线程?或者,如何将django设置传递给这个工作线程(成功加载apache变量)?如果可能的话,我想继续使用apache虚拟主机方法来定义变量,因为这里有很多设置。

这更多的是关于如何启动芹菜,而不是您展示的任何Django代码。如果环境变量对服务器可用,但对任务工作者不可用,则不能在您启动芹菜的任何环境中设置它。如何设置该变量?你是如何开始芹菜和Django的?你必须原谅我,因为我对所有这些技术都不熟悉-我在Pycharm中工作,使用本地调试器运行Django(我正在Pycharm环境配置中设置环境变量以进行调试),我正在启动Pycharm终端的工人-这就是你说的吗?
[2018-02-16 14:23:01,516: ERROR/ForkPoolWorker-2] Task 
exposures.tasks.process_exposure_file[27d7e651-e73e-49f1-bd20-8ab80b90d13a] 
raised unexpected: KeyError('BH_ENVIRONMENT_NAME',)
Traceback (most recent call last):
File "/var/www/BeachHouse/bhvenv/lib/python3.6/site-
packages/celery/app/trace.py", line 374, in trace_task
R = retval = fun(*args, **kwargs)
File "/var/www/BeachHouse/bhvenv/lib/python3.6/site-
packages/celery/app/trace.py", line 629, in __protected_call__
return self.run(*args, **kwargs)
File "/home/bryan/PycharmProjects/BeachHouse/exposures/tasks.py", line 10, 
in process_exposure_file
exposure = Exposure.objects.get(pk=exposure_id)
File "/var/www/BeachHouse/bhvenv/lib/python3.6/site-
packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/var/www/BeachHouse/bhvenv/lib/python3.6/site-
packages/django/db/models/query.py", line 397, in get
num = len(clone)
File "/var/www/BeachHouse/bhvenv/lib/python3.6/site-
packages/django/db/models/query.py", line 254, in __len__
self._fetch_all()
File "/var/www/BeachHouse/bhvenv/lib/python3.6/site-
packages/django/db/models/query.py", line 1179, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "/var/www/BeachHouse/bhvenv/lib/python3.6/site-
packages/django/db/models/query.py", line 50, in __iter__
db = queryset.db
File "/var/www/BeachHouse/bhvenv/lib/python3.6/site-
packages/django/db/models/query.py", line 1109, in db
return self._db or router.db_for_read(self.model, **self._hints)
File "/var/www/BeachHouse/bhvenv/lib/python3.6/site-
packages/django/db/utils.py", line 258, in _route_db
chosen_db = method(model, **hints)
File "/home/bryan/PycharmProjects/BeachHouse/BeachHouse/db_routers.py", line 
16, in db_for_read
environment = os.environ['BH_ENVIRONMENT_NAME']
File "/var/www/BeachHouse/bhvenv/lib/python3.6/os.py", line 669, in 
__getitem__
raise KeyError(key) from None
KeyError: 'BH_ENVIRONMENT_NAME'
ENVIRONMENT_NAME = os.environ.get('BH_ENVIRONMENT_NAME')
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ['DJANGO_SETTINGS_MODULE'] = 'BeachHouse.settings'

app = Celery('BeachHouse')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('BeachHouse.settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()