2017-01-23 120 views
2

我在我的Django項目中具有以下結構。正如你所看到的,有一個名爲「博客」的應用程序以及與項目本身同名的主應用程序。Django項目提供多個應用程序的靜態文件

enter image description here

我遇到的問題與從static目錄主體工程提供靜態文件做。 blog應用程序有其自己的static目錄,並且這些文件已正確服務(當遍歷相關的URL路由時)。

有人能告訴我我做錯了什麼嗎?另外,處理多個應用程序時提供靜態文件的最佳做法是什麼?將所有樣式和腳本轉儲到項目根目錄中的普通static目錄是明智的做法,還是將應用程序與應用程序完全分開是否更好?

settings.py

import os 

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 

STATIC_ROOT = os.path.join(BASE_DIR, "..", "django_by_example_blog", "static") 
STATIC_URL = '/static/' 

urls.py

urlpatterns = [ 
    url(r'^$', TemplateView.as_view(template_name="base.html")), 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^blog/', include('blog.urls', namespace='blog', app_name='blog')), 
] 

base.html文件

{% load staticfiles %} 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <meta name="description" content=""> 
    <meta name="author" content=""> 
    <title>Home | Triangle</title> 
    <link href="{% static "css/bootstrap.min.css" %}" rel="stylesheet"> 
    <link href="{% static "css/font-awesome.min.css" %}" rel="stylesheet"> 
    <link href="{% static "css/animate.min.css" %}" rel="stylesheet"> 
    <link href="{% static "css/lightbox.css" %}" rel="stylesheet"> 
    <link href="{% static "css/main.css" %}" rel="stylesheet"> 
    <link href="{% static "css/responsive.css" %}" rel="stylesheet"> 

    <!--[if lt IE 9]> 
     <script src="{% static "js/html5shiv.js" %}></script> 
     <script src="{% static "js/respond.min.js" %}"></script> 
    <![endif]-->  
    <link rel="shortcut icon" href="{% static "images/ico/favicon.ico" %}"> 
    <link rel="apple-touch-icon-precomposed" sizes="144x144" href="{% static "images/ico/apple-touch-icon-144-precomposed.png" %}"> 
    <link rel="apple-touch-icon-precomposed" sizes="114x114" href="{% static "images/ico/apple-touch-icon-114-precomposed.png" %}"> 
    <link rel="apple-touch-icon-precomposed" sizes="72x72" href="{% static "images/ico/apple-touch-icon-72-precomposed.png" %}"> 
    <link rel="apple-touch-icon-precomposed" href="{% static "images/ico/apple-touch-icon-57-precomposed.png" %}"> 
</head><!--/head--> 

<body> 

回答

1

「轉儲全部樣式和腳本到一個通用的靜態目錄「正是collectstatic命令所做的。你應該運行它,並配置你的服務器來從那裏提供文件。

首先,雖然您應該將您的STATIC_ROOT設置設置爲指向該公用目錄,而不是在您的應用程序內。

+1

你能否詳細說明指定? – MadPhysicist

+0

呃,特別是什麼? –

+0

在哪裏運行命令,如何修復代碼。如果我完全瞭解框架,我不會問這個問題。 – MadPhysicist

1

STATIC_ROOT指定保存在運行collectstatic命令

python manage.py collectstatic 

你似乎已經指定你的應用程序的靜態文件夾作爲static_root的一個所有靜態文件將被傾倒的文件夾。

最好給另一個文件夾保存所有的靜態文件。

STATIC_ROOT = os.path.join(BASE_DIR, "static") 

當您運行collectstatic命令時,它將收集所有靜態文件並將它們放置到static_root文件夾中。

雖然在DEBUG = True的情況下運行,但您不必擔心這些。 Django將爲所有靜態內容提供服務(包括在單個應用程序內),但在生產環境中,這不被推薦,並且它將是Web服務器提供靜態內容的工作。

編輯:

你還需要在你的基地urls.py

from django.conf.urls.static import static 
from django.conf import settings 

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

問題是,這似乎並沒有工作。當我用與你一樣的方式指定'STATIC_ROOT'時,我的CSS文件仍然沒有找到。有沒有辦法測試這個? 另外,我是否正確理解'collectstatic'會查看每個應用程序內的靜態文件夾,並將它們物理移動到由'STATIC_ROOT'指定的任何內容中? – MadPhysicist

+0

是的,collectstatic會查看每個應用程序內的所有靜態文件夾,並將它們移動到static_root指定的文件夾。 在您的瀏覽器中查看源代碼中css文件的url,看看它是否與預期的一致? – at14

+1

URL就像這個''/static/css/bootstrap.min.css''出來的,但是找不到它們。在這一點上,我不確定Django認爲什麼是應用程序的根本。 – MadPhysicist