2010-01-20 91 views
13

每次我通過SSH登錄到我的服務器我需要鍵入以下內容:爲什麼我需要DJANGO_SETTINGS_MODULE集?

export DJANGO_SETTINGS_MODULE=settings 

,如果我不把manage.py模塊的任何使用失敗

我manage.py具有以下添加代碼:

if "notification" in settings.INSTALLED_APPS: 
    from notification import models as notification 

    def create_notice_types(app, created_models, verbosity, **kwargs): 
     notification.create_notice_type("friends_invite", _("Invitation Received"), _("you have received an invitation")) 
     notification.create_notice_type("friends_accept", _("Acceptance Received"), _("an invitation you sent has been accepted")) 

    signals.post_syncdb.connect(create_notice_types, sender=notification) 
else: 
    print "Skipping creation of NoticeTypes as notification app not found" 

任何想法?

回答

11

manage.py正在引用應用程序(notifications)。這迫使Django抱怨設置了DJANGO_SETTINGS_MODULE,因爲Django環境尚未設置。

順便說一句,你可以手動強制環境設置,但老實說,我不會這樣做manage.py。我認爲這不是一個好的做法。

下面是如何可以手動安裝任何應用程序內Django的環境(或程序爲此事):

# set up the environment using the settings module 
from django.core.management import setup_environ 
from myapp import settings 
setup_environ(settings) 
+0

謝謝你的回覆。 你的意思是不推薦使用,因爲降低了可移植性? 請解釋原因。 – RadiantHex 2010-01-20 16:00:30

+2

是的,它降低了便攜性。應該避免將管理工具與應用程序耦合在一起。應用程序和項目都應該有獨立移動的部分。想象一下未來,您需要將應用程序移動到另一個項目,或從當前項目中移除一個應用程序。最好不要讓它們交織在一起,而是從應用程序本身內部(安全地)執行任何類型的檢查。 – jathanism 2010-01-20 16:06:16

6

你需要設置DJANGO_SETTINGS_MODULE環境變量,因爲它是Django是如何知道你的設置模塊被調用(所以你可以有不同的項目或測試和開發。)你可以在腳本本身之前設置它你直接或間接地導入django,但是當你運行Django時不會有太大的好處提供的腳本。

最簡單的解決方案可能只是在你的shell的啓動腳本中設置DJANGO_SETTINGS_MODULE,所以你不必手動設置它。將其添加到的常用文件是.bash_profile和.bashrc(如果確實使用bash)

+0

謝謝托馬斯。你可以在某些方向指向我的bash腳本嗎?我通過Putty登錄,並且在腳本啓動時沒有任何線索。 – RadiantHex 2010-01-20 16:05:16

+1

那麼,您登錄到的任何操作系統或發行版的文檔都是一個好的開始:)但是,一個好的選擇是添加相同的導出行因爲您已經在使用.bash_profile或.bashrc文件,在其他類似的導出行附近。每一個新外殼都應該加載其中的一個。 – 2010-01-20 17:17:08

0

默認情況下,manage.py會在與自身相同的目錄中查找設置模塊。如果找不到,則會彈出一條消息,以代替使用django-admin.py。在運行execute_manager之前,它實際上並沒有設置environemnt。如果您在調用管理功能之前需要運行鉤子,我所見過的做法是將它們放入相關應用程序的models.py中。