2017-04-11 89 views
1

我有一個Django應用程序,它以比監視應用程序顯示更好的方式顯示另一個監視應用程序創建的監視視頻縮略圖(作爲各自視頻的超鏈接)他們本地。Django:media_root不在項目目錄中的相對路徑

基本上我有一個腳本,每隔半小時將文件從監視應用程序的存儲位置移動到生產服務器將它們提供給Django應用程序的位置。

說,這些文件移動到服務器上的這個位置:

/media/djangoAppMedia/ 

對於發展迄今,我有我的MEDIA_ROOT硬編碼到該路徑:

MEDIA_ROOT = '/media/djangoAppMedia/' 

我d喜歡將其改爲前進的相對路徑,但我可以找到的所有示例始終引用位於主Django應用程序項目中的媒體根。

Ex: MEDIA_ROOT = os.path.join(ENV_PATH, 'media/')

如何將媒體根設置爲不在我的Django目錄中的相對路徑?

或者,我應該將文件移動到我的項目中的媒體目錄中嗎?或者,甚至使用這些靜態?

有一些灰色地帶到我,因爲這些文件是不喜歡它似乎「提交用戶」是通常的用例爲媒根,但他們也似乎沒有融入普通的Django靜用例。

回答

1

問題就變成了什麼?生產網絡服務器對當前目錄的看法可能會令人驚訝。

如果你的意思是相對於您的源文件,則:

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文件..

+0

這是一個很好的觀點。也許實際的目標是不讓它在任何地方被硬編碼,而不是使用絕對路徑的解決方案。我將探討環境變量選項,但我的prod服務器是apache,我不認爲它可以在那裏工作。我是唯一的開發人員,但我希望在github上獲得此項目,並且不希望我的開發操作系統用戶名暴露在任何地方。防爆。 'MEDIA_ROOT ='/ Users//media /'' – brewcrazy

+0

@brewcrazy我已經更新了我的答案以添加一些Apache細節.. – thebjorn

+0

謝謝。額外的信息真的很有用。我一直在努力爲我的開發服務器設置apache,以更貼近地反映生產環境。您的建議將派上用場。 – brewcrazy