2016-02-26 108 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” –