【问题标题】:Unable to load static file in django 1.8无法在 django 1.8 中加载静态文件
【发布时间】:2015-12-17 08:25:11
【问题描述】:

这里是settings.py的相关配置:

import os

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',
    'marcador'
)

STATIC_URL = '/static/'

#STATICFILES_DIR = (
#    os.path.join(BASE_DIR, 'static'),
#)

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

在项目 urls.py 中;

from django.conf.urls import include, url
from django.contrib import admin
from django.core.urlresolvers import reverse_lazy
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^', include('marcador.urls')),
    url(r'^login/$', 'django.contrib.auth.views.login', 
        {'template_name': 'login.html'}, name='mysite_login'),
    url(r'^logout/$', 'django.contrib.auth.views.logout',
        {'next_page': reverse_lazy('marcador_bookmark_list')}, 
        name='mysite_logout'),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

在 marcador 应用程序 urls.py 中;

urlpatterns = [
    url(r'^user/(?P<username>[-\w]+)/$', 'marcador.views.bookmark_user',
        name='marcador_bookmark_user'),
    url(r'^$', 'marcador.views.bookmark_list', name='marcador_bookmark_list'),
]

在模板/base.html(提取)中;

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>Marcador - {% block title %}{% endblock %}</title>
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="apple-touch-icon" href="{% static 'apple-touch-icon.png' %}">

    <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
    <style>
        body {
            padding-top: 50px;
            padding-bottom: 20px;
        }
    </style>
    <link rel="stylesheet" href="{% static 'css/bootstrap-theme.min.css' %}">
    <link rel="stylesheet" href="{% static 'css/main.css' %}">

    <script src="{% static 'js/vendor/modernizr-2.8.3-respond-1.4.2.min.js' %}"></script>
</head>

这是我的目录结构(项目名为marca,应用程序名为marcador);

+-- marca
+-- marcador
|   +-- migrations
|   +-- templates
|       +-- marcador
+-- static
|   +-- admin
|   |   +-- css
|   |   +-- img
|   |   |   +-- gis
|   |   +-- js
|   |       +-- admin
|   +-- css
|   +-- img
|   +-- js
|       +-- vendor
+-- templates

这里是变量的打印输出;

Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import settings
>>> print settings.BASE_DIR
/home/fabrice/Documents/Programing/django/marca
>>> print settings.PROJ_DIR
/home/fabrice/Documents/Programing/django/marca/marca
>>> print settings.STATIC_URL
/static/
>>> print settings.STATICFILES_DIR
('/home/fabrice/Documents/Programing/django/marca/marca/static',)
>>> print settings.STATIC_ROOT
/home/fabrice/Documents/Programing/django/marca/static
>>>  

页面内容显示正确,但由于服务器返回 404 错误,引导程序未加载;

[20/Sep/2015 16:09:53] "GET / HTTP/1.1" 200 4822
[20/Sep/2015 16:09:54] "GET /static/css/bootstrap.min.css HTTP/1.1" 404 1676
[20/Sep/2015 16:09:54] "GET /static/css/bootstrap-theme.min.css HTTP/1.1" 404 1694
[20/Sep/2015 16:09:54] "GET /static/js/vendor/modernizr-2.8.3-respond-1.4.2.min.js HTTP/1.1" 404 1751
[20/Sep/2015 16:09:54] "GET /static/css/main.css HTTP/1.1" 404 1649
[20/Sep/2015 16:09:54] "GET /static/js/vendor/bootstrap.min.js HTTP/1.1" 404 1691
[20/Sep/2015 16:09:54] "GET /static/js/main.js HTTP/1.1" 404 1643
[20/Sep/2015 16:09:54] "GET /static/js/vendor/bootstrap.min.js HTTP/1.1" 404 1691
[20/Sep/2015 16:09:54] "GET /static/js/main.js HTTP/1.1" 404 1643

我已经阅读了一些关于同一问题的帖子,但是当我打印 BASE_DIR 变量时仍然无法正常工作,我可以看到路径是正确的。

我能让它正常工作的唯一方法是复制引导静态文件;

/usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/css/

我只是不明白它已经花了相当多的时间。

有什么建议吗?

有关信息我正在做这个教程http://django-marcador.keimlink.de/en/

【问题讨论】:

    标签: python django django-staticfiles


    【解决方案1】:

    您应该查看 Django 文档。有一个关于管理静态文件的特定页面:

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

    在开发过程中,您的项目 urls.py 应该是:

    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns = [
        url(r'^admin/', include(admin.site.urls)),
        url(r'^', include('marcador.urls')),
    ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    

    但在生产中,一种常见的做法是使用您的 http 服务器来处理您的静态文件。生产配置的答案是广泛的,因为它取决于您的堆栈。

    【讨论】:

    • 将您的 STATIC_ROOT 设置为 os.path.join(BASE_DIR, 'static') 并可能删除设置 STATICFILES_DIR
    • 还是一样,没有引导,我一定是做错了什么
    • 您是否尝试将您的静态文件夹移动到您的 marcador 应用程序文件夹?
    【解决方案2】:

    我知道回答太晚了,但我发现如果我使用下面的 STATICFILES_DIRS 并注释 STATIC_ROOT,它可以正常工作

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

    【讨论】:

      【解决方案3】:

      您的STATICFILES_DIR 包含错误值。你使用os.path.join(BASE_DIR, '/static')

      引用documentation for join

      如果组件是绝对路径,则抛出之前的所有组件 离开并从绝对路径组件继续加入。

      请看下面的代码示例:

      >>> os.path.join('/a', 'b', '/c', 'd')
      '/c/d'
      

      解决方法:去掉'/static'中的前导斜杠:os.path.join(BASE_DIR, '/static')

      【讨论】:

      • 抱歉,Matthias 我的文件中有错字,我尝试了很多方法却忘记删除“/”
      【解决方案4】:

      让我们看看... 当你创建一个新的项目 marca 时,你会得到一个包含你的 settings.py、wsgi.py 等的子文件夹 marca。通常,我在这里为我的非应用程序特定的静态文件创建一个静态文件夹。然后我可以有一个 settings.py PROJ_DIR 来定位它,例如

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

      现在除了 BASE_DIR 之外,我还有一个 PROJ_DIR 指向我的子文件夹 marca。现在进行更多设置。

      STATIC_URL = '/static/' #pretty much ok
      STATICFILES_DIR = (
          os.path.join(PROJ_DIR, 'static'), #additional location of static files
      )
      
      STATIC_ROOT = os.path.join(BASE_DIR, 'static')
      

      STATIC_ROOT 中的文件将在 STATIC_URL(在您的情况下为 /static/)提供服务,通常由单独的静态文件服务器(如 nginx)提供。它最初应该是空的。要将文件放入 STATIC_ROOT,请运行

      python manage.py collectstatic 
      

      它将在您的应用静态文件夹和 STATICFILES_DIR 中的所有路径中查找,并创建一个可供服务的目录结构。

      在您的模板 base.html 中,您需要添加

      {% load staticfiles %}
      

      如果你不这样做,我希望你会得到一个错误。 基本上,我是在向你提出这个新结构。

      manage.py
      +-- static (your STATIC_ROOT is currently pointing here. empty initially but check after running collectstatic
      +-- marca
          settings.py
          wsgi.py
          urls.py
          +-- static
          |   +-- css
          |   +-- img
          |   +-- gis
          |   +-- js
          +-- templates
      +-- marcador
      |   +-- migrations
      |   +-- templates
      |       +-- marcador
      

      【讨论】:

      • 按要求完成但仍然是同样的问题,还要注意 collectstatic 的输出“0 个静态文件复制到 '/home/fabrice/Documents/Programing/django/marca/static',62 个未修改。”也只有当我在 /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/ 中复制文件时才提到它按预期工作
      • 你有 Debug=False 吗?您可能希望在使用开发服务器时将其设置为 True。 0 已复制,因为您已经有这些文件,您可以删除并再次运行 collectstatic。
      • debug 设置为 true,我已删除文件并再次运行 collect static 但仍然没有运气。此外,collectstatic 在文件夹 static 内创建了一个文件夹 admin。我仍然无法弄清楚是什么问题
      • 我改变了STATIC_ROOT,它不是一个元组。我必须从您的原始代码中复制和粘贴。这可能就是您遇到的问题。
      • 好的,但是对 STATIC_ROOT 的更改并没有太大的影响。 admin 是 static 中唯一的文件夹吗?如果是这种情况,它无法在 STATICFILES_DIR 中找到其他文件,即 os.path.join(PROJ_DIR, 'static') 您应该在其中拥有引导文件和其他非应用特定的静态文件。
      猜你喜欢
      • 2016-03-02
      • 2020-11-12
      • 2014-09-03
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 2014-07-12
      相关资源
      最近更新 更多