2012-06-10 149 views
5

我想我的第一個正確的webdev項目,我正在學習Django框架。Django的靜態文件和settings.py中的文件路徑

我來到這裏詢問有關使用「靜態文件」,如外部CSS我指的是在我的HTML模板,一個最徹底的方法。我嘗試通過official documentation on the subject閱讀,但發現它作爲一個初學者有點混亂,然後我嘗試了谷歌搜索,但我注意到大多數指南或stackoverflow答案不同,我意識到我需要一個更好的理解。有點討厭地問,但是,有人可以向我解釋和總結這個過程嗎?

作爲參考,這裏是我的項目文件夾層次結構。目前,我正在試圖讓模板base.html使用sylesheet在CSS/base.cssenter image description here

而且那不斷拋出我送行的事情之一是使用絕對文件路徑的。到目前爲止,我設法擺脫了使用相對文件路徑的束縛,這對我來說更有意義,因爲我的目標是在django測試服務器上開發,然後在我擁有一臺服務器時將其傳輸到我自己的服務器上。 (注意:也許是因爲我不知道傳輸過程有多複雜,我不明白爲什麼絕對文件路徑是首選)。使用相對文件路徑有什麼問題?

我意識到,這已經有點成爲兩個問題,這是違反規定的,但我真的覺得既可以回答在一起,如果我理解的話,大概我幫助其他的理解。任何幫助將非常感激。

回答

2

我打算假設您使用的是Django 1.3或更高版本,因爲它允許您爲靜態文件使用staticfilesdocs)。這裏的基本思想是:每個Django的網站由包含所需網站的特定部分的所有文件,多個應用程序(目錄)的(即models.pyviews.py,一個templates目錄,也是一個static目錄)。此static目錄包含JavaScript和CSS文件(以及該應用程序的其他靜態文件)

部署網站時,運行collectstatic命令將所有靜態文件收集到一個目錄中,然後從該目錄中。靜態文件到您的網站(即Apache或不同的Web服務器可以爲你做)的遊客

所以Web項目的一般結構可能是:

  • manage.py
  • website/models.py
  • 網站/ views.py
  • 網站/靜態/網站/ CSS/base.css
  • 網站/靜態/網站/ JS/base.js
  • 網站/模板/網站/ base.html文件
  • 靜態
  • settings.py
  • urls.py

你會發現Django應用程序的名稱在的子目錄重複和templates目錄。這是必要的,因爲它將文件移動到一個通用的static目錄。在上面的例子中,STATIC_ROOT是頂級目錄static,進入這個目錄後,所有的靜態文件都會被複制。

這絕對是值得一讀的staticfiles文件作爲該項目的佈局,可以重複使用的輕鬆其他項目的Django應用。例如,你可以想像一個網站,看起來像這樣:

  • 博客/ models.py
  • 博客/模板/博客/ overview.html
  • 博客/模板/博客/ post.html
  • 博客/ urls.py
  • 博客/ views.py
  • 照片/ models.py
  • 照片/模板/照片/ overview.html
  • PHO TOS /模板/照片/ photo.html
  • 照片/ urls.py
  • 照片/ views.py
  • manage.py
  • 靜態
  • settings.py
  • urls.py

的應用blogphotos現在可以輕鬆地在其他網站如果需要重複使用。

+0

非常感謝您的例子對於所有的信息來說,我認爲這是正確的,因爲你對保持代碼模塊化以及解釋部署過程做了一些很好的說明。不幸的是,我是一個傻瓜,還沒有能夠找出如何讓自己的實踐項目正確設置,但我決定在這裏打開一個新的,更具體的問題:http://stackoverflow.com/questions/ 11033571/using-static-files-with-the-django-virtual-server – Holly

+0

這對於工頭命令如何工作?我得到的一切工作正常,直到我開始嘗試使用工頭 - 並且它不會在本地加載任何靜態資產......但在部署時工作得很好......來自Simeon的這個答案是我見過的最清晰的解釋處理靜態文件的過程 - 但我希望在使用工頭和活動實例時更清晰一些......現在我的管理員在工頭上查看時沒有css ......任何想法? – tbarbe

1

真的很感謝@Simeon Visser的回答,並且有一些非常有用的信息,但它並不完全是我所期待的。所以,我一打聽,從書籤交易已經sinister_user_name感謝這一點,而且我認爲他可以幫助別人:


靜態文件在最近的版本改變了公平一點,所以老的博客可能會有點亂。

我給它一個鏡頭:

在你的模板,您可以使用static_url標籤和Django會在你的路徑填寫。

<link rel="stylesheet" href="{{ STATIC_URL }}css/bootstrap.min.css"> 

它通過查看您的設置文件來填充靜態url。 STATIC_URL默認爲/static/我覺得在設置?如果靜態文件最終出現在公司Web服務器上的一個奇怪的URL中,則可以在設置中進行更改,並且它將反映在所有模板中。所以它們是否絕對無關緊要。

當您開始部署時,您將在設置中填寫STATIC_ROOT,這只是您設置Web服務器以查找靜態文件的路徑。然後,如果您運行manage.py collectstatic,它會將它們複製到該目錄。這是我認爲的STATIC_ROOT的唯一功能。

我將模板目錄與我的靜態目錄分開,主要是因爲您希望您的web服務器僅用於提供靜態文件,而模板則由python進行處理。因此,靜態文件幾乎不是應用程序的一部分,只要Web服務器查看它們即可。我將模板和靜態文件保存在基本目錄中的單獨路徑中,主要是因爲它們都不是Python源文件。

所以,我的項目結構是這樣的:

manage.py 
website/settings.py 
app/models.py 
app/views.py 
templates/base.html 
static/js/jquery.js 
static/css/bootstrap.css 

的問題相對路徑是,他們都需要,如果你的URL方案的變化而變化。

可選:我在這個博客中發現,這有助於不把絕對文件系統路徑放入settings.py,如果你在多臺機器上工作,比如工作和家庭,那麼這個路徑很好:( 由於1.4的佈局略有不同這在我的設置上:

import os 
import django 
import manage 

DJANGO_ROOT = os.path.dirname(os.path.realpath(django.__file__)) 
SITE_ROOT = os.path.dirname(os.path.realpath(manage.__file__)) 

,而不是他們有什麼建議(設置的位置在1.4或1.3移動),所以SITE_ROOT被搞砸了,我認爲可能的工作 在進一步的下跌。我使用這個設置:

# Additional locations of static files 
STATICFILES_DIRS = (
    os.path.join(SITE_ROOT, 'static'), 
) 

這將告訴開發服務器在哪裏可以找到靜態文件。您可以對模板執行相同的操作,也可以使用完整的文件路徑。

+1

雖然您的設置較少模塊化,但您的信息也正確無誤。理想情況下,所有靜態文件和模板文件都應位於應用程序內的目錄中(只有少數例外,例如需要位於根模板目錄中的404.html和500.html)。在本地開發時,'STATIC_ROOT'目錄應該是空的,並且它只能在生產服務器上有文件。 –

4

這裏是一組來自的代碼片段settings.py我已更改爲包含靜態文件 drchrono項目的Django設置。

import os 
import django 
DJANGO_ROOT = os.path.dirname(os.path.realpath(django.__file__)) 
SITE_ROOT = os.path.dirname(os.path.realpath(__file__)) 

爲SITE_ROOT目錄

DATABASES = { 
     'default': { 
      'ENGINE': 'django.db.backends.sqlite3', 
      'NAME': os.path.join(SITE_ROOT,'data.db'),      

在sqlite3的數據庫存儲需要絕對地址

  'USER': '', 
      'PASSWORD': '', 
      'HOST': '',      
      'PORT': '',      
     } 
    } 


STATIC_ROOT = SITE_ROOT 
STATIC_URL = '/static/' 

店靜態這裏

STATICFILES_DIRS = (
    os.path.join(SITE_ROOT,'static'), 
     ) 

其中日文件的動態設置變量Ë模板存儲

TEMPLATE_DIRS = (
    os.path.join(SITE_ROOT,'templates'), 

) 

現在在模板中使用

{% load static %} --at beginning 
<link href="{% static "css/bootstrap.min.css"%}" rel="stylesheet" media="screen"> 

這是展示如何在靜態目錄訪問「CSS/bootstrap.min.css