Django静态文件404

Posted

技术标签:

【中文标题】Django静态文件404【英文标题】:Django Static files 404 【发布时间】:2012-09-30 08:07:09 【问题描述】:

我无法启动我的静态文件。我已经尝试了各种设置和目录配置等,但它们只是显示为 404。我已经安装了 debug_toolbar,所以知道 STATIC_URL 正在到达我的请求上下文。

显示 /static 的目录结构(我还把目录放在了饭菜应用文件夹和用户中,只是为了尝试一下。

/mealmate
    /mealmate
    /meals
    /static
        /css
             /bootstrap.min.css
    /templates
    /users

Settings.py(一些重要的设置,尽管我已经尝试过其他各种设置):

MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media/')

STATIC_URL = '/static/'

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

WSGI_APPLICATION = 'mealmate.wsgi.application'

在base.html中渲染

    <link rel="stylesheet" href="/static/css/bootstrap.min.css">

有什么想法吗? 谢谢

【问题讨论】:

如果我手动生成了静态文件夹,为什么还需要运行 collectstatic?无论如何我做了,但它仍然没有工作。尽管进行了设置,Django 仍无法识别我的静态文件夹。 试试:python manage.py findstatic --verbosity 2 css/styles.css 看看 Django 在哪里寻找你的静态文件。 @deed02392 我知道这是很久以后的事了,但是谢谢,我不知道为什么我的不工作。无论我如何尝试在我的设置中更改STATIC_URL,它都不起作用。然后那个命令帮我找到位置,我不知道为什么它不会改变 很高兴它帮助了@Amon,它也是帮助我弄清楚发生了什么的关键命令 【参考方案1】:

这是 django for windows 中静态/媒体/模板访问的有效解决方案,

settings.py

import os.path

STATIC_ROOT = ''

STATIC_URL = '/static/'

STATICFILES_DIRS = ( os.path.join('static'), )

【讨论】:

谢谢,太好了!有关更多信息,您可以关注 blog.xjtian.com/post/52685286308/… 这个博客,非常实用的描述如何在 django 中使用静态服务。 os.path.join('static') 给出简单的'static' 这对我也有帮助。为了更具体地确定我的问题,我的 join() 字符串中有一个前导“/”。 STATIC_ROOT 规范不是必需的。而且,正如@SławomirLenart 指出的那样,您可以摆脱join 并只使用字符串。 @cirrusio STATIC_ROOT 实际上是我所需要的。我正在按照教程进行操作,但无法加载静态文件。我只是添加了 STATIC_ROOT = '' 行,它就开始工作了。我不需要任何其他更改。【参考方案2】:

对我来说,这是由于在settings.py 中将 debug 设置为 false 造成的。一种解决方法是将--insecure 开关传递给runserver,但真正的解决方案是使用适当的Web 服务器来提供静态文件。有关详细信息,请参阅this question 的答案。

【讨论】:

老兄。经过几个小时的尝试,这解决了这个问题。谢谢 谢谢++我快疯了。 这个!非常感谢,几乎疯狂地调试我的静态文件... yyyuuup。可以在生产服务器上运行,但我的一位开发人员在 Windows 上的本地运行服务器上遇到问题。事实证明需要在本地启用调试 :-) 谢谢! :-) 这个问题有多傻?在对生产进行一些更改并设置 Debug = False 后,我的开发环境突然停止提供静态文件,我花了好几个小时才找到这个解决方案。这应该记录在某处或在日志中给出明确的警告。【参考方案3】:

如果您在 Web 服务器上运行此程序,您是否将静态文件复制到公共可访问文件夹?例如:

# web accessible folder
STATIC_ROOT = '/home/your_name/www/mealmate/static/'

# URL prefix for static files.
STATIC_URL = '/static/'

# Additional locations of static files
STATICFILES_DIRS = (
    # location of your application, should not be public web accessible 
    '/home/your_name/website/mealmate/static',
)

# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

然后您可以使用这篇帖子Django static Files 并使用manage.py 将静态文件复制到公共可访问文件夹

# --link    Create a symbolic link to each file instead of copying.
# --noinput Do NOT prompt the user for input of any kind.
#
python manage.py collectstatic -link --noinput

希望有帮助!

【讨论】:

URI 是否有意不同? (www vs website)? @Rikki 是的,以表明您可以添加其他静态文件目录。 Django 将捆绑这些目录中的所有文件并复制到STATIC_ROOT【参考方案4】:

从上面的 cmets - 运行这个

python manage.py findstatic --verbosity 2 css/styles.css

找不到与“css/styles.css”匹配的文件。

查看以下位置: /Users/yourname/Documents/Workspace/test/staticfiles

我只是将我的 static 文件夹重命名为 staticfiles,一切都很好。 (我在 osx + django 1.x 上)

如果您在本地开发盒上,使用不安全模式可能不会受到伤害 - 否则您可能仍然会收到 404 错误。

python manage.py runserver --insecure

更新

实际上是在settings.py中挖掘发现了侵权行。

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'staticfiles'),
)

【讨论】:

【参考方案5】:

如果您最近在设置文件中将调试更改为 false。遵循此程序。

大部分时间是由settings.py中的debug设置为假造成的。如果您将 --insecure 开关传递给 runserver 它应该可以工作。因此,如果您使用python manage.py runserver 0.0.0.0:8000,请将其改为python manage.py runserver 0.0.0.0:8000 --insecure

它应该可以工作。

【讨论】:

通过阅读我正在接受的文档,django 将在开发模式下提供静态数据。另一方面,对于开发模式关闭,您应该真正使用 nginx,因为 django 提供静态服务效率低下。上面的标志表示您承认这一事实。【参考方案6】:

我只是添加了等价的

STATICFILES_DIRS = (
    '/absolute_path_to_project/mealmate/static',
)

让这个工作。当然,请将absolute_path_to_project 替换为您的实际路径,并在必要时添加驱动器号。

【讨论】:

【参考方案7】:

我也陷入了 404 问题,直到我意识到 Apache 阻止了对静态目录的请求。我使用python manage.py collectstatic 将所有静态文件复制到我的项目根目录下的static 目录,即/var/my/site/static。与

Alias /static /var/my/site/static
<Directory /var/my/site/static>
        Require all granted
</Directory>

/etc/httpd/conf/httpd.conf中,现在可以正常使用了。

如果以上答案都不起作用,您可以考虑检查您的服务器配置。

【讨论】:

我将别名设置为Alias /static/ /var/my/site/static,因为它在docs.djangoproject.com/en/1.11/howto/deployment/wsgi/modwsgi/… 上,并将第一次调用更改为/static 为我解决了这个问题。谢谢!【参考方案8】:

就我而言,我所要做的就是重新运行服务器:

python manage.py runserver

【讨论】:

【参考方案9】:

我假设你在这里使用的是 Django1.3+。

首先,您需要定义更多设置:

STATICFILES_FINDERS = [
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]

STATICFILES_DIRS = [
    path.join(TOP_DIR, 'static'),
]

STATIC_ROOT = path.join(TOP_DIR, 'staticfiles')
STATIC_URL = '/static/'

这应该可以帮助您找到该目录。

此外,您应该始终使用STATIC URL 访问您的静态文件:

<link rel="stylesheet" href=" STATIC_URL css/bootstrap.min.css">

【讨论】:

嗨,我正在使用 STATIC_URL 。有点不清楚,我展示的 html 是渲染文件,以证明标签正在工作。我在本地工作,所以我认为只需要一个 STATIC_URL 设置,只要 /static 目录就位。【参考方案10】:

确保食客在您的 INSTALLED_APPS 中

【讨论】:

【参考方案11】:

setting.py下面添加

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

【讨论】:

【参考方案12】:

在 Django 中,您的模板还有一个优势,那就是您可以像这样链接静态数据,也许这就是您的问题!

<script src="% static 'myapp/bootstrap.min.js' %"></script>
<link href="% static 'myapp/bootstrap.css' %" rel="stylesheet" type="text/css"/>

更好用

% static '文件名' %

而且它也更容易 想了解更多,我参考https://docs.djangoproject.com/en/1.11/intro/tutorial06/

【讨论】:

【参考方案13】:

在我的情况下,我的静态文件位于resources/static 目录中,我在settings.py 文件中设置了一些设置:

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

并像这样在我的模板中使用它:

% load static %
    <link rel="stylesheet" type="text/css" href="% static '/plugins/bootstrap/css/bootstrap.css' %">

这种方法对我有用。

【讨论】:

【参考方案14】:

将以下行插入项目主文件夹的 settings.py 中:

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

然后,在html文件中插入:

% load static %

最后,在settings.py中,将django.contrib.staticfiles添加到INSTALLED_APPS = [...]

【讨论】:

【参考方案15】:

在您的设置中将 DEBUG 变量更改为 True。

如果启用了调试,runserver 方法只会查找静态数据,如果没有,它将在 STATIC_ROOT url 中查找

【讨论】:

【参考方案16】:

如果您遇到此错误,请首先检查调试的真假,以及您是否同时使用“STATIC_ROOT”和“STATICFILES_DIRS”

对于我的情况,我在 settings.py 中使用了以下内容:

import os (You have to import os at first)



#(If the app is in production mode then False. By default True)

   DEBUG = False 

#(If debug is false then add allowed hosts)

   ALLOWED_HOSTS = ['*'] 

#(Built in)

   STATIC_URL = '/static/' 

   STATIC_ROOT = 'static' (You have to add it to the code)

   STATICFILES_DIRS = [ os.path.join(BASE_DIR, '/static') ] (You have to add it to the code)

【讨论】:

【参考方案17】:

我认为您错过了将应用 INSTALLED_APPS 放入您的 settings.py 文件中,您应该添加“mealmate”

INSTALLED_APPS = (
    'mealmate',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

之后静态和命令文件将对 django 可见。我在使用命令时遇到问题,这就是我修复它的方式。

【讨论】:

【参考方案18】:

在 Cpanel 上这是一个很好的解决方案 here

在 cpanel 的终端上安装 dj-static static3

pip install dj-static static3

然后在 wsgi.py 中替换这段代码 py 应用程序

from dj_static import Cling

application = Cling(get_wsgi_application())

【讨论】:

【参考方案19】:

我遇到了同样的问题。这里我如何解决访问模板中的静态文件。

我的 Django 项目(Recognition/)文件目录如下:

/media
   /1
     i1.jpg
     i2.jpg
     ....

/static
    /css
       /op.css
    /img
       /emoji.png

/Recognition
    ...
    /settings.py
    /urls.py
    ...

/uploader
    ...
    /urls.py
    /templates
         /uploader
             /create.html
    ...

我的 settings.py 如下所示:

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

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'Recognition',
    'uploader',
]

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

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

我的 (Recognition/urls.py) 看起来像这样:

urlpatterns = [
    path('admin/', admin.site.urls),
    ...
]
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

然后我访问模板(create.html)中的所有静态文件和媒体文件,如下所示: 这是示例代码

<!DOCTYPE html>
<html>
<head>
   % block extrahead %
      <link rel="stylesheet" type="text/css" href="static/css/op.css">
   % endblock %
</head>

<style type="text/css">
.notfound .notfound-404 
  ...
  background-image: url('static/img/emoji.png');
  ...

<style>

<body>
  <img src=" MEDIA_ROOT /media/i1.jpg" class="image_responsive"  >
</body>

你可以使用这个 django 命令来查看 django 在哪里看到你的静态文件。 SOURCE

python manage.py collectstatic --help

【讨论】:

【参考方案20】:

对我来说,我除了运行 manage.py runserver myip:port 什么都不做。然后我关闭它并重新启动uwsgi,静态文件加载成功。我不知道为什么,但它对我有用......

【讨论】:

【参考方案21】:

我能够通过将 js 文件名从骆驼大小写更改为蛇大小写来解决同样的问题。

【讨论】:

以上是关于Django静态文件404的主要内容,如果未能解决你的问题,请参考以下文章

Django:404 模板中的静态文件

在 django 开发中加载静态文件时出现 404 错误

django 2.0 中的错误 404 静态文件

django nginx静态文件404

Django 静态文件 404 未找到 nginx

Django 项目设置 Debug=False 后静态文件和上传文件404错误问题解决