2011-10-11 51 views
1

在我的Django項目中,我爲每個應用程序app1/static /,app2/static等設置了靜態文件夾。它對開發服務器可以正常工作。Nginx和Django:如何跨越多個路徑的位置

但是,當我切換到通過fastcgi使用Django開發服務器+ nginx。有一個問題,我只能將靜態映射到一個位置。在Nginx中,是否可以將app1/static /,app2/static等映射到url/static。

以下配置似乎不起作用。什麼是實現它的正確方法?由於

location ^~ /static/ { 
    root "app1/static/";app2/static; 
    } 

回答

3

您應該按照https://docs.djangoproject.com/en/dev/howto/static-files/

它說的是你從你的應用程序文件夾中的static/子文件夾中提供文件。在您的模板中,您使用{{ STATIC_URL }}或舊版本{% get_static_prefix %}。在開發服務器下的調試模式下,Django將直接處理應用程序文件夾中static子文件夾中的文件。

當您切換到nginx時,您按照Aviral的建議運行collectstatic。這會將static/子文件夾中的所有文件收集到STATIC_ROOT文件夾中。爲了不在一個文件夾中的所有文件,我建議在您的應用程序中使用static/app-name文件夾。在這種情況下,STATIC_ROOT將填充不同的app-name子文件夾,並且每個應用程序的靜態文件都是分開的。模板必須引用像{{ STATIC_URL }}/app-name/my_static_image.jpg這樣的文件。

你的nginx的配置應該不是單純的樣子:

location ^~ /static { 
    root <your STATIC_ROOT path>; 
} 
+0

謝謝。我已閱讀過此鏈接。但用你的答案重新閱讀對我來說更有意義。我終於明白了現在使用了什麼STATIC_ROOT。 –

2

對不起,我不知道很多關於nginx的,但我不認爲你需要做的,原因在於manage.py collectstatic命令會自動將您的所有靜態文件到一個目錄(STATIC_ROOT)爲你。我希望這能解決你的問題。

+0

感謝您的回答。但是我想用自己的靜態子文件夾來保持每個應用程序的獨立性,因爲這個項目只是爲了學習的目的,所有的應用程序實際上都是互不相關的。 –

+0

您仍然可以使用靜態文件:AppDirectoriesFinder從每個應用程序的靜態目錄中收集文件(https://docs.djangoproject.com/en/1.3/ref/contrib/staticfiles/#staticfiles-finders)。 – arie

+0

是的,我正在使用開發服務器。但使用Nginx時會出現問題:無法訪問app2的靜態文件。請在問題中查看我的更新。 –

0

只是嘗試這樣在測試服務器 -

test directory structure 
/home 
    /username 
     /static_test1 
      test1.txt 
      style.css 
     /static_test2 
      test2.txt 
      style.css 

#nginx.conf 
server { 
    server_name example.com; 

    location/{ 
     root /home/username; 
     try_files /static_test1$uri /static_test2$uri =404; 
    } 
} 

如果我去example.com/test1.txt我得到的內容test1.txt,它也適用於test2。但它沒有任何類型的自動索引頁面,如果你不打電話給正確的文件,你會得到一個Nginx 404.

我不知道這是在生產中最好的事情。

貸記this serverfault question,我只是測試它,以確保它的工作。

我主要關注的是: 同名文件。他們從第一個列出的目錄中拉出。

如果您與跨應用程序/項目的文件更新一致,這可能是一個巨大的問題。例如,style.css將從static_test1中取出

您真的可能想要考慮您想要託管靜態文件的方式。正如其他人所提到的。從v1.3開始,Django的靜態文件處理功能正是您在一個命令中所需要的 - manage.py collectstatic。它將所有應用程序靜態文件夾同步到一個用於託管的集中文件夾。

+0

上面的答案告訴我,collectstatic是最好的選擇。儘管我只能接受一個答案,但我確實已經從所有人那裏學到了東西。謝謝。 –