2016-02-26 144 views
0

在我的本地Mac服務器上運行Django項目時,當嘗試訪問靜態文件時,出現404錯誤。Django返回404的靜態文件

我的目錄結構如下:

myapp/static 

在我的settings.py我已經嘗試了多種以下組合:

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

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

STATICFILES_DIRS = [ 
    os.path.join(PROJECT_ROOT, 'static'), 
    '/var/www/myapp/static', 
    '/pycharmprojects/myapp/static' 
] 

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
    'django.contrib.staticfiles.finders.FileSystemFinder', 
) 

對於每一個使用一個靜態文件,我得到一個的在PyCharm中出現如下錯誤:

GET /static/img/pastedsvg%2017.svg HTTP/1.1" 404 101 

而在Firefox中出現如下錯誤:

GET 
http://127.0.0.1:8888/static/img/pastedsvg%2017.svg [HTTP/1.0 404 NOT FOUND 15ms] 

我已經看過其他答案在這個問題在Stackoverflow和嘗試的建議,但迄今沒有任何作品。

+0

是你通過apache/nginx服務的文件? – Mox

+0

這是我認爲是Apache的默認Mac服務器?但我不知道如何確切地確定正在使用的服務器。 –

+0

好的,你必須執行manage.py runserver嗎? – Mox

回答

5

這是很難說究竟該問題可能是什麼,但這裏有一些意見,可以幫助:

  1. STATIC_ROOT僅用於collectstatic。當您從命令行(python -m django collectstatic)運行它時,collectstatic將複製您的靜態文件。
  2. STATIC_ROOT不應該包含在STATICFILES_DIRS中,因爲這會混淆collectstatic,因爲它的工作是將靜態文件從靜態目錄複製到STATIC_ROOT
  3. AppDirectoriesFinder將在每個應用程序下的目錄static中查找靜態文件。因此,例如,如果您的項目位於/pycharmprojects/myapp/,AppDirectoriesFinder將在/pycharmprojects/myapp/anapp/static/pycharmprojects/myapp/anotherapp/static(對於INSTALLED_APPS中列出的每個應用程序)目錄中查找靜態文件,並將它們複製到STATIC_ROOT
  4. FileSystemFinder將使用STATICFILES_DIRS中的值查找靜態文件並將其複製到STATIC_ROOT(這就是爲什麼您的STATIC_ROOT的值不應在STATICFILES_DIRS中列出的原因)。
  5. 當處於調試模式時,您不需要collectstatic,因爲Django將在其原始位置中查找文件,但在非調試模式時(您的Django配置文件中爲DEBUG = False),您需要運行collectstatic以使Django找到你的靜態文件。

所以,從這個,我建議:

  1. 當然,從你的STATICFILES_DIR
  2. 刪除os.path.join(PROJECT_ROOT, 'static')大概從STATICFILES_DIR刪除/pycharmprojects/myapp/static如果指向同一位置os.path.join(PROJECT_ROOT, 'static')
  3. 如果你是沒有以調試模式運行(Django配置文件中的DEBUG = True),請從命令行運行collectstatic,以便Django可以看到您的靜態文件。

還有一個問題。指向哪個目錄是你的BASE_DIR?看起來好像PROJECT_DIR可能是多餘的,因爲它指向BASE_DIR通常指向的位置。

希望在這段文字牆上有所幫助。

乾杯!

+0

非常感謝您的詳細信息!我嘗試了Debug True和False。我的靜態文件包含在/ pycharmprojects/mdir/static中,不在/ pycharmprojects/mydir/myapp/static中。我已經減少了設置中的相關代碼。PY剛: STATIC_URL = '/靜態/' STATIC_ROOT = os.path.join(BASE_DIR, '靜') 仍然得到404雖然 –

+0

嗯......讓我們用'DEBUG = TRUE'運行。我從你的許多回復中猜測你的目錄結構(如適當修改),但要確保在'STATICFILES_DIRS'中列出了'/ Users/billnoble/PycharmProjects/mydir/static'。確保存在'/ Users/billnoble/PycharmProjects/mydir/static/img/pastedsvg 17.svg'文件。我根本不認識Mac,所以我不知道他們是如何處理區分大小寫的,但爲了確保路徑和文件名與目錄和文件的大小相匹配。讓我們看看我們是否至少可以得到這個文件的工作。 – CaffeineFueled

+0

我有DEBUG = FALSE,但是我對STATICFILES_DIRS中包含「/ Users/billnoble/PycharmProjects/mdir/static」感到困惑。在你的主要答覆中,你是否沒有說STATICFILES_DIRS中不應該包含STATIC_ROOT? –

0

我不知道以下是正確的答案,但我希望它會順利。

STATIC_URL = '/static/' 
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) 
STATICFILES_DIRS = [ 
    # os.path.join(PROJECT_ROOT, "static"), 
    os.path.join(BASE_DIR, "static"), 
] 
print("PROJECT_ROOT", PROJECT_ROOT) 
print("BASE_DIR", BASE_DIR) 

在這種情況下,該變量的值命名PROJECT_ROOT是存在設置文件在同一目錄。 這就是爲什麼它不完全是PROJECT_ROOT

即使在設置文件中寫入python-code,也可以在運行服務器時執行。因此,您可以再次驗證代碼是否正確寫入。

+0

謝謝科羅林。嘗試此操作時,我爲PROJECT_ROOT獲取「/ Users/billnoble/PycharmProjects/cues2/myapp」,爲BASE_DIR獲取「/ Users/billnoble/PycharmProjects/myapp」。儘管如此,我仍然遇到了404錯誤。 –

+0

「/ Users/billnoble/PycharmProjects/cues2/myapp」和「/ Users/billnoble/PycharmProjects/myapp」...我想這很明顯 – Mox

+0

對不起,這是一個錯字!對於PROJECT_ROOT應該是「/ Users/billnoble/PycharmProjects/mydir/myapp」,對於BASE_DIR應該是「/ Users/billnoble/PycharmProjects/mydir」 –