[英]Django 2.2 Not Serving Static Files
我目前正在通過一些教程來增強對Django的了解。 為此,我決定使用最新版本的Django。 我可以克服我的代碼與教程代碼之間的大部分差異,唯一的區別是-不提供靜態文件。 現在,我不能完全確定差異是否完全取決於Django版本。 這是怎么回事。
我有以下項目結構:
settings.py
STATIC_URL = '/static/'
STATIC_FILES = (
os.path.join(BASE_DIR, "static"),
)
STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "staticfiles", "static")
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "templates")],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
有趣的是,使用此配置,項目能夠成功找到模板。 但是,如上所述,它找不到靜態文件。 這是為什么?
另外,本教程還設置了一個不尋常的配置,其中static
和templates
目錄位於主應用程序的目錄內,而我通常將其高一級,即位於項目根目錄下。 這可能是問題的一部分嗎? 在這個特定項目的設置中,什么使Django查找文件的目錄低了一個目錄? 設置似乎與我完成的其他項目相同。 但是,這些項目在項目的根目錄中包含static
目錄和templates
目錄。
任何幫助和澄清表示贊賞。
編輯:
urls.py
from django.contrib import admin
from django.urls import path
from .views import home
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('', home, name='home')
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
嘗試替換此:
STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "staticfiles", "static")
與
STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "static")
還提供文件的狀態(例如404消息)
要提供靜態文件,您需要在urls.py
添加以下配置為:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
接下來,我相信將static
和templates
放入自己的應用程序中是一個好習慣,如果您希望在不久的將來使該應用程序可插拔 ,這將非常有用。
或者,將所有靜態文件收集在項目級別目錄中並在設置中添加以下內容以進行標識也是一種很好的做法。
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
編輯:我只看到更新的問題。 嘗試添加以下內容:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('', home, name='home')
]
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
這就是說,只要我們處於調試模式,就可以提供靜態文件。
據我所知,STATIC_FILES對Django沒有任何意義,盡管您可能會將其用於其他目的。
您用STATIC_ROOT定義的方式指向的目錄不存在。
有一個在StackOverflow的一個很好的參考這里
嘗試這個:
STATIC_ROOT = os.path.join (BASE_DIR, "taskbuster", "static")
通過將設置更改為以下內容,可以解決此問題:
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "static")
此外,在嘗試了解如何解決此問題時閱讀以下文檔很有幫助。
https://docs.djangoproject.com/zh-CN/2.2/ref/settings/#std:setting-STATICFILES_FINDERS
特別是,這清楚地解釋了Django所做的事情:
默認設置將查找存儲在STATICFILES_DIRS設置(使用django.contrib.staticfiles.finders.FileSystemFinder)和每個應用程序的靜態子目錄(使用django.contrib.staticfiles.finders.AppDirectoriesFinder)中的文件。 如果存在多個具有相同名稱的文件,則將使用找到的第一個文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.