首页 文章

Django - 找不到静态文件

提问于
浏览
46

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

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

这是我的设置

...
STATIC_ROOT = '/home/glide/Documents/django/cbox/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
  '/static/',
)
...

我的urls.py

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

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

css
  main.css
javascript
image

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

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

5 回答

  • 8

    我困惑 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/'),
    )
    

    另外别忘了 from django.conf import settings

  • 18

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

    • static/my_app/ 目录添加到 my_app (请参阅下面有关命名空间的说明)

    • 定义一个新的顶级目录,并将其添加到settings.py中的STATICFILES_DIRS(注意 The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting

    我更喜欢第一种方式,并且设置接近defined in the documentation的方式,所以为了提供文件 admin-custom.css 以覆盖几种管理方式,我有这样的设置:

    .
    ├── my_app/
    │   ├── static/
    │   │   └── my_app/
    │   │       └── admin-custom.css
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    ├── static/
    ├── templates/
    │   └── admin/
    │       └── base.html
    └── manage.py
    
    # settings.py
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    STATIC_URL = '/static/'
    

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

    # /templates/admin/base.html
    {% extends "admin/base.html" %}
    {% load static %}
    
    {% block extrahead %}
        <link rel="stylesheet" href="{% static "my_app/admin-custom.css" %}">
    {% endblock %}
    

    在开发期间,如果使用django.contrib.staticfiles [ed:默认安装],当DEBUG设置为True时,runserver将自动完成此操作[...] https://docs.djangoproject.com/en/ 1.10 / HOWTO /静态文件/

    部署时,我运行 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/

  • 72

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

    1) STATIC_URL = '/static/'

    2)

    STATICFILES_DIRS = (
        os.path.join(BASE_DIR, "static"),
    )
    

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

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

    DEBUG = False
    

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

  • 2

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

    INSTALLED_APPS = [
        # ...
        'your_app',
    ]
    

    没有它,你可能会面临诸如没有检测到静态文件,基本上所有涉及你的应用程序的文件的问题 . 即使通过使用正确的答案建议它是正确的:

    STATICFILES_DIRS = (adding/path/of/your/app)
    

    可能是其中一个错误,如果出现此错误,应该进行审核 .

  • 0

    {'document_root', settings.STATIC_ROOT} 需要 {'document_root': settings.STATIC_ROOT}

    或者你会收到像 dictionary update sequence element #0 has length 6; 2 is required 这样的错误

相关问题