Django应用程序无法识别静态文件。

3

我有一个 Django 应用程序,但我无法加载静态文件。我的模板可以完美加载,但CSS和JS文件无法加载。以下是我的文件:

zeinab@ZiZi:~/Desktop/MyProject$ tree
.
├── __init__.py
├── manage.py
├── myapp
│   ├── __init__.py
│   ├── lib
│   │   ├── decorators.py
│   │   ├── dorsa_forms.py
│   │   ├── __init__.py
│   │   └── utils.py
│   ├── log
│   ├── media
│   │   └── admin
│   │       └── background_login
│   │           └── bg1.jpg
│   ├── settings.py
│   ├── static
│   │   ├── calendar.js
│   │   └── inbox.css
│   ├── templates
│   │   ├── 404.html
│   │   ├── base.html
│   │   └── index.html
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
└── requirements.txt

8 directories, 18 files

当我运行runserver时,每个CSS和JS文件都会得到"GET /static/file/url HTTP/1.1" 404 1265的响应。以下是MyProject/manage.py的内容:
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
    from django.core.management import execute_from_command_line
    execute_from_command_line(sys.argv)

这里是文件的内容:
import os
from django.contrib.messages import constants as messages

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',
    'sorl.thumbnail',
    'myapp.lib',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

SITE_ID = 1

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
)

ROOT_URLCONF = 'myapp.urls'

TEMPLATES = [
    {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, "templates")],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.i18n',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
            'django.template.context_processors.i18n',
        ],
    },
    },
]

WSGI_APPLICATION = 'myapp.wsgi.application'

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

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

LOG_PATH = os.path.join(BASE_DIR, 'log')

DEBUG = True

这是MyProject/myapp/urls.py文件:

from django.conf import settings
from django.conf.urls import include, url
from django.conf.urls.static import static
from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from .views import default
urlpatterns = [
    url(r'^$', default, name='default'),
    url(r'^admin/', admin.site.urls),
]
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

这是 MyProject/myapp/wsgi.py 文件:
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
application = get_wsgi_application()

编辑 1:

我已将 MyProject/myapp/urls.py 修改为以下内容:

from django.conf import settings
from django.conf.urls import include, url
from django.views import static
from django.contrib import admin
from .views import default

urlpatterns = [
    url(r'^$', default, name='default'),
    url(r'^admin/', admin.site.urls),
    url(r'^public/(?P<path>.*)$', static.serve, {
    'document_root': settings.MEDIA_ROOT
}, name='url_public'),
]

我最终得到了相同的结果。

编辑2:

我还尝试使用urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)代替urlpatterns += staticfiles_urlpatterns(),然后尝试运行collectstatic; collectstatic成功完成,但打开URL仍返回"GET /static/file/url HTTP/1.1" 404 1265

2个回答

2
替换
urlpatterns += staticfiles_urlpatterns()

by

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
staticfiles_urlpatterns() 只用于调试,以便在静态文件中获得显示视图。如在https://docs.djangoproject.com/en/1.11/ref/contrib/staticfiles/上所述,它不应在生产中使用
注意:只有在收集静态文件时才会使用STATIC_ROOTMEDIA_ROOT(使用manage.pycollectstatic)。它指定了存储静态和媒体文件的绝对路径(通常是/var/www/myapp/static/var/www/myapp/media)。

1
在您的urls.py中,您忘记说明如何“计算”静态路由文件。
而不是这样:
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

试试这个:

from django.views import static

urlpatterns = [
    # [...]
    url(r'^public/(?P<path>.*)$', static.serve, {
        'document_root': settings.MEDIA_ROOT
    }, name='url_public'),
]

在您的模板文件中(您没有提供样本),请尝试:
{% load static %}
<h1>{% static 'calendar.js' %}</h1>

不要忘记使用PyCharm,因为它对这些事情非常有帮助(它可以识别路径,并且您将在模板文件中获得自动完成功能(Ctrl + Space))。

当我运行runserver时,会得到 AttributeError: 'function' object has no attribute 'serve' 错误。你使用的是特定版本的 Django 吗?我使用的是最新版 1.11.5 - Zeinab Abbasimazar
使用PyCharm,转到单词“static”,然后按“Alt-enter”“enter”,这样PyCharm就会在您的urls文件顶部添加正确的“import”,或者手动添加它:from django.views import static - Olivier Pons
这就是关键所在:正如你在问题中看到的那样,我使用了django.conf.urls.static中的static,但你提到的是来自django.viewsstatic。请在你的回答中提到这一点。 - Zeinab Abbasimazar
1
@ZeinabAbbasi 好的,我已经编辑了我的答案,感谢您的建议。它是否有效并且回答/指引了您的方向? - Olivier Pons
我仍然得到了我在问题中提供的“404”错误。 - Zeinab Abbasimazar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接