2014-02-23 50 views
6

所以我已經環顧了很多,但找不到一個好的答案。 我使用Celery 3.1.7和Django 1.5.1,沒有django-celery包,因爲Celery的新版本不再需要它。 我設法設置了任務並使用RabbitMQ執行它們。一切都在工作,因爲它應該在那裏。不過,我正在將其融入一個現有的,相當龐大的Django項目中。在那裏,我們指定了幾個Django設置文件,而不僅僅是一個。我們根據環境運行不同的環境,例如本地機器和服務器。我的問題是,我似乎無法追蹤哪個設置文件是從我的項目根目錄中運行celery.py文件(如文檔指定的)的芹菜工作者處於「活動狀態」。有文件要求指定Django的設置文件是這樣的:芹菜工作人員的活動Django設置文件

os.environ.setdefault('DJANGO_SETTINGS_MODULE', "project.settings.server") 

現在這個工作,但如果我在本地移動的東西,我需要將其更改爲settings.local,使其工作,而每一次。在運行時讀取設置對象就像我在標準Django文件中做的一樣,因爲芹菜工作者在不同的進程中執行。 因此,使用這種情況下,有沒有人有任何想法如何從芹菜工人動態獲取活動的Django設置文件?或者,當啓動芹菜工作人員時可能將其作爲變量傳入? (如Django等--settings = project.settings.local) 謝謝!

回答

3

一個想法可能是讓Django每次加載正確的設置文件,並讓芹菜使用Django正在使用的一個。我就是這麼做的。

假設你有一個項目結構:

project/ 
    proj/ 
     settings.py 
     urls.py 
     ... 

project/ 
    proj/ 
     settings/ 
      __init__.py 
      local.py 
      production.py 
      common_settings.py 
      ... 
     urls.py 
     ... 

令更換common_settings.py是所有環境之間共享的所有設置,讓你的初始化的.py負載任何配置應使用。

# __init__.py: 

from common_settings import * 

# A check for environment variable, hostname, etc: 
# Example for checking hostname: 
from platform import node 
if node() in ['dev1', 'dev2']: 
    from local import * 
elif node() in ['prod1', 'prod2']: 
    from production import * 

現在,您可以始終依賴project.proj.settings作爲您的環境的正確設置文件。

+0

爲什麼downvote?它解決了這個問題。 – olofom

+0

我其實很喜歡這種方式,看起來像個不錯的開始!非常感謝! – MaRiNkO

+0

不適用於我 – Nirri

2

setdefault()返回系統環境中變量的值。只有在DJANGO_SETTINGS_MODULE沒有定義的情況下,它纔會返回"project.settings.server"

所以,我會留下最常用的設置模塊在那裏並在需要時通過顯式聲明的環境變量進行更改:

即地方發展,在你的virtualenv掛鉤,在你.bashrc,手動等:

export DJANGO_SETTINGS_MODULE=project.settings.local

+0

一個很好的提示,但是,我有多個服務器設置以及多個服務器環境,因此需要在每個服務器環境中設置鉤子,這打破了我的「開箱即用」的想法。否則,一個好方法,可能會用於其他一些東西,謝謝! – MaRiNkO

20

在命令行初始化芹菜工作者時,只需在celery命令之前設置環境變量即可。

DJANGO_SETTINGS_MODULE='proj.settings' celery -A proj worker -l info

+1

我知道它太舊了。但是我因爲需要同樣的東西而大跌眼鏡。我做了'export DJANGO_SETTINGS_MODULE ='proj.settings'celery -A proj worker -l info' –