問題就變成了什麼?生產網絡服務器對當前目錄的看法可能會令人驚訝。
如果你的意思是相對於您的源文件,則:
DIRNAME = os.path.dirname(__file__)
MEDIA_ROOT = os.path.join(DIRNAME, 'some', 'path', 'under', 'this', 'folder')
如果你的意思是完全獨立的項目的路徑,那麼你就需要一些方法來找到它的兩個開發和生產線。環境變量是做到這一點的一種方法:
MEDIA_ROOT = os.environ['MY_VIDEO_FILES']
你必須確保環境變量是什麼開始運行時環境設置。
當然你也可以使用if語句在你的settings.py:
if DEBUG:
MEDIA_ROOT = os.path.abspath('../../some/relative/path')
else:
MEDIA_ROOT = '/some/absolute/path/on/prod/server'
這工作得很好,而且是最容易,特別是如果你是唯一的開發商。
更新: Apache等。
在啓用mod_env
Apache模塊,它可以定義環境變量(在你的虛擬主機):
SetEnv MEDIA_ROOT /absolute/path/to/media/root
那些阿帕奇ENV瓦爾,所以你必須改變你的wsgi.py
文件,讓他們到Django的(改編自http://ericplumb.com/blog/passing-apache-environment-variables-to-django-via-mod_wsgi.html):
from django.core.wsgi import get_wsgi_application
_application = get_wsgi_application()
def application(environ, start_response):
os.environ['MEDIA_ROOT'] = environ.get('MEDIA_ROOT', '')
return _application(environ, start_response)
這是一個很大的工作,但如果你建立自己的服務器,這會是歡顏。
它很容易,只需使用MEDIA_ROOT = '/media/'
讓Apache的重定向爲你(在你的虛擬主機):
Alias /media/ /absolute/path/to/media/root
在你設置那麼你可以做:
MEDIA_ROOT = os.environ.get("MEDIA_ROOT", '/media/')
和定義環境變量在您的開發環境中。
ps:取決於您正在編寫的軟件(例如可重複使用的軟件包),您可能不需要包含settings.py
文件..
這是一個很好的觀點。也許實際的目標是不讓它在任何地方被硬編碼,而不是使用絕對路徑的解決方案。我將探討環境變量選項,但我的prod服務器是apache,我不認爲它可以在那裏工作。我是唯一的開發人員,但我希望在github上獲得此項目,並且不希望我的開發操作系統用戶名暴露在任何地方。防爆。 'MEDIA_ROOT ='/ Users//media /'' –
brewcrazy
@brewcrazy我已經更新了我的答案以添加一些Apache細節.. – thebjorn
謝謝。額外的信息真的很有用。我一直在努力爲我的開發服務器設置apache,以更貼近地反映生產環境。您的建議將派上用場。 – brewcrazy