Django-정적 파일을 찾을 수 없습니다.


80

이 문제에 대한 여러 게시물을 보았지만 내 해결책을 찾지 못했습니다.

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, 자바 스크립트 및 이미지에 대한 패턴을 개별적으로 지정해야합니까?

답변:


110

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


2
아니요 urls.py는 질문 (미디어 같은 것)처럼해야하고하는 것을 잊지 마세요 from django.conf import settings물론
피에르 드 LESPINAY

이 답변에 추가하고 싶습니다. s를 놓치지 마십시오. STATICFILES_DIRS 여야합니다. 나는 STATICFILE_DIRS를했고 45 분 동안 오류를 찾아서 나를 미치게 만들었다.
니콜로 m.

1
내가 사용 BASE_DIR하는 대신 const를 내장 SITE_ROOT하고 그것을 작동합니다.
Maduka Jayalath 2007

33

settings.py문제를 일으키는 것은 두 가지뿐입니다 .

1) STATIC_URL = '/static/'

2)

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

정적 파일은 프로젝트의 설정 파일과 동일한 디렉토리에있는 정적 디렉토리에 있어야합니다.

정적 파일이로드되지 않는 경우에도 이유는입니다.

DEBUG = False

True로 변경하십시오 (엄격히 개발 전용). 프로덕션 STATICFILES_DIRS에서는 정적 파일이있는 경로로 변경 하십시오.


2
제 경우에는 디버그 용 환경 변수가 거짓이었습니다. 나는 그것을 사실로 설정하고 이제는 작동합니다
Smit Patel

안녕하세요 .. 언급 된 모든 솔루션을 시도했지만 여전히 404를 제공합니다. 누군가 제발 도와 줄 수 있습니까?
Mukul_Vashistha

32

정적 파일을 제공하는 방법은 여러 가지가 있습니다. 여기에 내 메모가 있습니다.

  • 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
# 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/static-files/

배포 할 때 collectstaticnginx로 정적 파일을 실행 하고 제공합니다.


나를 위해 모든 혼란을 해결 한 문서 :

STATIC_ROOT

collectstatic이 배치를 위해 정적 파일을 수집하는 디렉토리의 절대 경로입니다.

... 정적 파일을 영구적으로 저장하는 곳 이 아닙니다 . 기본적으로 'static /'앱 하위 디렉토리와 STATICFILES_DIRS에 포함 된 모든 디렉토리 인 staticfiles의 파인더에서 찾을 수있는 디렉토리에서이를 수행해야합니다.

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


정적 파일 네임 스페이스

이제 우리는 (다른 my_app 하위 디렉토리를 만드는 대신) my_app / static /에 직접 정적 파일을 넣을 수 있지만 실제로는 나쁜 생각입니다. Django는 이름이 일치하는 첫 번째 정적 파일을 사용하며, 다른 애플리케이션에 동일한 이름의 정적 파일이있는 경우 Django는 이들을 구별 할 수 없습니다. Django가 올바른 것을 가리킬 수 있어야하며이를 확인하는 가장 쉬운 방법은 네임 스페이스를 지정하는 것입니다. 즉, 이러한 정적 파일을 응용 프로그램 자체의 이름이 지정된 다른 디렉토리에 넣습니다.

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


STATICFILES_DIRS

프로젝트에는 특정 앱에 연결되지 않은 정적 자산도있을 수 있습니다. 앱 내에서 static / 디렉토리를 사용하는 것 외에도 Django가 정적 파일을 찾는 설정 파일에서 디렉토리 목록 (STATICFILES_DIRS)을 정의 할 수 있습니다.

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


8

정적 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()

6
  1. STATIC_ROOT라인을 제거 할 수 있습니다.
  2. 또는 static다른 디렉토리에 다른 폴더를 만들 수 있습니다 . 디렉토리가 다음과 같다고 가정합니다. project\static 이제 업데이트 :
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'project/static/')
    ]
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')

당신은 요점이 무엇 이건 STATICFILES_DIRSSTATIC_ROOT같은 디렉토리를 포함 할 수 없습니다.

오랜만이라는 건 알지만 새로운 친구들이 도움을받을 수 있기를 바랍니다.


3

다음과 같이 INSTALLED_APPS목록에 앱이 나열되지 않는 또 다른 오류가있을 수 있습니다 .

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

포함하지 않으면 정적 파일, 기본적으로 앱과 관련된 모든 파일을 감지하지 못하는 것과 같은 문제에 직면 할 수 있습니다. 다음을 사용하여 정답에서 제안한대로 정확할 수 있지만

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

오류 중 하나 일 수 있으며이 오류가 발생하면 검토해야합니다.


2

INSTALLED_APPS에 내 프로젝트 이름을 추가하여이 문제를 해결합니다.여기에 이미지 설명 입력


이 나를 위해 그것을 해결하지만 난 각각의 응용 프로그램 내 경우에는 자신의 정적 폴더가 있어야 더 나은 솔루션을해야 할 수도 있습니다 생각
SeanDp32

1

DEBUG로컬 설정에서 내 설정을 이동 하여 기본값으로 덮어 쓰는 것을 발견했습니다 False. 기본적으로 DEBUG및을 사용 하여 개발하는 경우 DEBUG 설정이 실제로 false인지 확인하십시오 runserver.


1

cmd type 명령 python manage.py findstatic --verbosity 2 static 에서 Django가 정적 파일을 찾는 디렉토리를 제공합니다. 가상 환경을 만든 경우이 virtual_environment_name 폴더 내에 정적 폴더가 있습니다. VIRTUAL_ENVIRONMENT_NAME\Lib\site-packages\django\contrib\admin\static. 위의 'findstatic'명령을 실행할 때 Django가이 경로를 표시하면이 정적 디렉토리에 모든 정적 파일을 붙여 넣습니다. html 파일에서 href에 JINJA 구문을 사용하고 다른 인라인 CSS를 확인하십시오. JINJA 구문을 제공 한 후에도 이미지 src 또는 url이 있으면 앞에 '/ static'을 추가합니다. 이것은 나를 위해 일했습니다.


1
TEMPLATE_DIR=os.path.join(BASE_DIR,'templates')
STATIC_DIR=os.path.join(BASE_DIR,'static')

STATICFILES_DIRS=[STATIC_DIR]

1

settings.py에 다음과 같은 내용이있을 수 있습니다.

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',

'DIRS': [ "templates"],

'APP_DIRS': True,

'OPTIONS': {
# ... 여기에 몇 가지 옵션 .. .
},
},]

또는

STATIC_URL = '/ 정적 /'

또는

STATICFILES_DIRS = (os.path.join (BASE_DIR, "정적"),)


0

django-storages예를 들어 django 앱에서 S3에 파일 업로드를 지원하기 위해 모듈 을 추가했고 저처럼 이 모듈의 문서를 올바르게 읽지 않았다면 다음 줄을 제거하십시오 settings.py.

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

그렇지 않으면 정적 자산이 로컬 시스템이 아닌 관리자 패널 CSS를 포함하여 S3 버킷에서 원격으로 표시되어 효과적으로 관리자 패널 CSS를 손상시킵니다.


0

STATICFILES_DIRS 에 사용되는 개발STATIC_ROOT에서 생산 ,

STATICFILES_DIRSSTATIC_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/'),
        ]

-1

{'document_root', settings.STATIC_ROOT} 될 필요가있다 {'document_root': settings.STATIC_ROOT}

또는 다음과 같은 오류가 발생합니다. dictionary update sequence element #0 has length 6; 2 is required

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.