2017-03-17 123 views
2

我正在開發一個多應用程序網站。我有一堆noob問題。 我的目錄結構看起來像如下:Django網站提供靜態文件服務

/var/www/html/portal 
    src/ 
     manage.py 
     portal/ 
     static/ 
      admin/ 
      css/ 
      img/ 
      js/ 
      fonts/ 
     templates/ 
      base.html 
      homepage.html 
    venv/ 
  1. 是我的目錄結構,作爲每Django的標準是什麼?
  2. 我的STATIC文件設置是否正確?

    STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), )

還是應

STATIC_URL = '/static/' 
STATIC_ROOT = os.path.join(PROJECT_DIR, 'static') 
  • 我應該collectstatic複製我的所有靜態文件,如CSS,JS等我也可以後在複製這些目錄中的文件之前做到這一點?
  • 如果我做collectstatic不提STATIC_ROOT我得到一個異常 django.core.exceptions.ImproperlyConfigured: You're using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.
  • 但是,當我用以下內容替換STATICFILES_DIRS,我的.css文件停止服務。我究竟做錯了什麼?

    STATIC_ROOT = os.path.join(PROJECT_DIR, 'static') 
    

    回答

    2

    當您運行開發服務器時,不需要運行staticfiles,並且DEBUG設置爲True

    靜態和媒體文件可以然後直接通過網絡處理(Docs)與這些行添加到您的主urls.py服務:

    if settings.DEBUG: 
        urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 
        urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 
    

    至於整個STATIC_URLSTATIC_ROOTMEDIA_URLMEDIA_ROOT,他們」所有這些都涉及到如何在生產環境中爲您的應用提供服

    那麼通常會發生的事情是,網絡服務器(即Nginx)處理服務文件,而不是Django應用程序。但Django應用程序需要知道它們在哪裏。所以:

    STATIC_URLMEDIA_URL需要在你的Django應用程序設置,並在您的Web服務器的配置相同,例如使用Nginx的:

    STATIC_URL = '/static/' 
    MEDIA_URL = '/media/' 
    ... 
    
    location /static { 
        alias /home/myusername/myproject/static/; 
    } 
    location /media { 
        alias /home/myusername/myproject/media/; 
    } 
    

    STATIC_ROOTMEDIA_ROOT是你想如何構建你的項目100%在服務器上。假設上述,你需要弄清楚如何指向/home/myusername/myproject/static/。我的設置

    例子:

    BASE_DIR = Path(__file__).parent.parent.parent 
    
    MEDIA_URL = '/media/' 
    MEDIA_ROOT = str(BASE_DIR.joinpath('media')) 
    
    STATIC_URL = '/static/' 
    STATIC_ROOT = str(BASE_DIR.joinpath('staticfiles')) 
    

    媒體文件將被直接上傳到MEDIA_ROOT,但是請注意,你需要以某種方式從你的應用程序的靜態文件(這可能是在一個文件夾的數量,你使用的庫可以有一些額外的靜態文件,Django Admin等等)到Nginx指向的文件夾(應該與STATIC_ROOT相同)。這就是collectstaticfiles進來並將所有靜態文件複製到該目錄。

    2

    關於目錄結構,關於如何設置應該有不同的意見。快速谷歌搜索可以調出一些關於Django項目結構的網站和討論。我建議閱讀一些信息,以確定什麼是最適合您和您的項目的。

    Django文檔還有一個最佳實踐頁面,這是一個很好的資源/提醒。 Django Best Practices.

    我主要關注Django目錄結構的兩個勺子。 Two Scoops幫助我理解了這一點。我自己的扭曲看起來像這樣。

    src/ 
        app/ 
        templates/ 
         app_name/ 
         base.html 
         other_pages.html 
        tests/ 
         tests.py 
        app_files.py 
        static/ 
        images/ 
        css/ 
        etc.. 
        templates/ 
        global_includes/ 
         include_file.html 
        base.html 
    

    的collectstatic不應該在開發過程中影響你的靜態文件的服務。從我瞭解到,collectstatic更當你在部署過程中,從一個單獨的服務器,或AWS,Heroku的等更多信息可以在這裏找到的文檔服務您的靜態文件:Managing Static Filesstaticfiles appDeploying static files

    我瞭解到,如果我的CSS文件沒有投放,通常與我的路徑有關。 Chrome開發人員工具檢查元素/控制檯可幫助我解決任何路徑錯誤。

    你有沒有加入

    + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 
    

    到您的主URLPATTERN/urls.py?

    這裏是開發過程中提供文件服務的詳細信息:Serving static files during development.

    最後檢查你的BASE_DIR以下是爲您的項目的正確路徑。你可能不得不改變它。

    我希望這會有所幫助。

    2

    請記住,如果您將DEBUG設置爲'False',它將忽略staticfiles設置,因爲預計您的web服務器將直接提供此服務。這讓我感到幾次,直到我意識到我沒有更新staticfiles文件夾(我因爲我現在不記得的原因而保存在單獨的存儲庫中)。