Django - 找不到静态文件

Pie*_*NAY 63 django static-files

我已经看过几个关于这个问题的帖子,但没有找到我的解决方案.

我正在尝试在Django 1.3开发环境中提供静态文件.

这是我的设置

...
STATIC_ROOT = '/home/glide/Documents/django/cbox/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
  '/static/',
)
...
Run Code Online (Sandbox Code Playgroud)

我的urls.py

urlpatterns = patterns('',
...
  url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root', settings.STATIC_ROOT}
  ),
...
);
Run Code Online (Sandbox Code Playgroud)

我的/ home/glide/Documents/django/cbox/static /目录就像

css
  main.css
javascript
image
Run Code Online (Sandbox Code Playgroud)

尝试访问http://127.0.0.1:8000/static/css/main.css时出现404错误.

我是否必须单独指定css,javascript和图像的模式?

Pie*_*NAY 90

我混淆了STATIC_ROOTSTATICFILES_DIRS

实际上我并没有真正理解STATIC_ROOT的实用性.我认为这是我必须放置我的公共文件的目录.此目录用于生产,这是collectstatic将放置(收集)静态文件的目录.

STATICFILES_DIRS是我需要的.

由于我在开发环境中,我的解决方案是不使用STATIC_ROOT(或指定另一个路径)并在STATICFILES_DIRS中设置我的公共文件目录:

#STATIC_ROOT = (os.path.join(SITE_ROOT, 'static_files/'))
import os
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
STATICFILES_DIRS = (
  os.path.join(SITE_ROOT, 'static/'),
)
Run Code Online (Sandbox Code Playgroud)

也别忘了 from django.conf import settings

  • 我使用 `BASE_DIR` 内置 const 而不是 `SITE_ROOT` 并且它有效。 (4认同)
  • 没有__urls.py__应该在问题中(媒体同样的事情)并且不要忘记`来自django.conf导入设置`当然 (2认同)

pti*_*tim 26

提供静态文件可以通过多种方式实现; 这是我对自己的笔记:

  • 添加一个static/my_app/目录my_app(参见下面关于命名空间的说明)
  • 定义一个新的顶级目录并将其添加到settings.py中的STATICFILES_DIRS(注意The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting)

我更喜欢第一种方式,并且设置接近文档中定义的方式,因此为了提供文件admin-custom.css来覆盖几种管理样式,我有一个如下设置:

.
??? my_app/
?   ??? static/
?   ?   ??? my_app/
?   ?       ??? admin-custom.css
?   ??? settings.py
?   ??? urls.py
?   ??? wsgi.py
??? static/
??? templates/
?   ??? admin/
?       ??? base.html
??? manage.py
Run Code Online (Sandbox Code Playgroud)
# settings.py
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
Run Code Online (Sandbox Code Playgroud)

然后在模板中使用它,如下所示:

# /templates/admin/base.html
{% extends "admin/base.html" %}
{% load static %}

{% block extrahead %}
    <link rel="stylesheet" href="{% static "my_app/admin-custom.css" %}">
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

在开发期间,如果使用django.contrib.staticfiles [ed:默认安装],当DEBUG设置为True时,runserver将自动完成此操作[...]

https://docs.djangoproject.com/en/1.10/howto/static-files/

在部署时,我collectstatic使用nginx 运行并提供静态文件.


文件清除了我的所有困惑:

STATIC_ROOT

collectstatic将收集静态文件以进行部署的目录的绝对路径.

...它不是永久存储静态文件的地方.您应该在staticfiles的finders找到的目录中执行此操作,默认情况下,这些目录是'static /'app子目录以及您在STATICFILES_DIRS中包含的任何目录.

https://docs.djangoproject.com/en/1.10/ref/settings/#static-root


静态文件命名空间

现在我们可以将我们的静态文件直接放在my_app/static /中(而不是创建另一个my_app子目录),但这实际上是个坏主意.Django将使用它找到的名称匹配的第一个静态文件,如果在不同的应用程序中有一个具有相同名称的静态文件,Django将无法区分它们.我们需要能够将Django指向正确的,并且确保这一点的最简单方法是通过命名它们.也就是说,将这些静态文件放在为应用程序本身命名的另一个目录中.

https://docs.djangoproject.com/en/1.10/howto/static-files/


STATICFILES_DIRS

您的项目可能还会包含与特定应用无关的静态资产.除了在应用程序中使用静态/目录外,您还可以在设置文件中定义目录列表(STATICFILES_DIRS),Django也会在其中查找静态文件.

https://docs.djangoproject.com/en/1.10/howto/static-files/


Nar*_*ula 14

settings.py文件中只有两件可以使你的静态文件服务.

1) STATIC_URL = '/static/'

2)

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)
Run Code Online (Sandbox Code Playgroud)

并且您的静态文件应位于静态目录下,该目录与项目的设置文件位于同一目录中.

即便如此,如果您的静态文件未加载,那么原因是,您可能已保留

DEBUG = False
Run Code Online (Sandbox Code Playgroud)

将其更改为True(严格仅限开发).在生产中,只需更改STATICFILES_DIRS为静态文件所在的任何路径.

  • 就我而言,这是我的调试环境变量是错误的。我将其设置为 true,现在它可以工作了 (3认同)

Hoa*_*ell 11

如果您的静态 URL 正确但仍然:

未找到:/static/css/main.css

也许你的 WSGI 问题。

? Config WSGI 服务于开发环境和生产环境

==========================project/project/wsgi.py==========================

import os
from django.conf import settings
from django.contrib.staticfiles.handlers import StaticFilesHandler
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
if settings.DEBUG:
    application = StaticFilesHandler(get_wsgi_application())
else:
    application = get_wsgi_application()
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,我使用 WSGI 并使用 Gunicorn 进行发布。这帮助了我..谢谢 (2认同)

yuv*_*yuv 7

  1. 您可以删除该STATIC_ROOT
  2. 或者您可以static在不同的目录中创建另一个文件夹。假设目录是:project\static 现在更新:
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'project/static/')
    ]
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
Run Code Online (Sandbox Code Playgroud)

无论你做什么,要点是STATICFILES_DIRS并且STATIC_ROOT不应该包含相同的目录。

我知道已经很久了,但希望新朋友能从中得到帮助


Shi*_*eph 6

STATICFILES_DIRS 用于开发STATIC_ROOT生产,

STATICFILES_DIRS 并且STATIC_ROOT不应具有相同的文件夹名称,

如果您需要在开发和生产中使用完全相同的静态文件夹,请尝试此方法

将此包含在 settings.py

import socket

HOSTNAME = socket.gethostname()

# if hostname same as production url name use STATIC_ROOT 
if HOSTNAME == 'www.example.com':
    STATIC_ROOT = os.path.join(BASE_DIR, "static/")

else:
    STATICFILES_DIRS = [
            os.path.join(BASE_DIR, 'static/'),
        ]
Run Code Online (Sandbox Code Playgroud)


Akl*_*ain 5

另一个错误可能是您的应用程序没有列在INSTALLED_APPS列表中,例如:

INSTALLED_APPS = [
    # ...
    'your_app',
]
Run Code Online (Sandbox Code Playgroud)

如果没有它,您可能会面临诸如无法检测到静态文件(基本上是涉及您的应用程序的所有文件)之类的问题。即使它可以按照正确答案中的建议正确使用:

STATICFILES_DIRS = (adding/path/of/your/app)
Run Code Online (Sandbox Code Playgroud)

可能是错误之一,如果出现此错误,应进行检查。