Django에서 정적 STATIC_URL과 STATIC_ROOT의 차이점


127

나는 혼란스럽고 static root명확하게하고 싶습니다.

Django에서 정적 파일을 제공하려면 다음이 settings.py및에 있어야합니다 urls.py.

import os
PROJECT_DIR=os.path.dirname(__file__)

1. 정적 파일을 수집해야하는 디렉토리의 절대 경로

STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')

2. 정적 파일의 URL 접두사

STATIC_URL = '/static/'

3. 정적 파일의 추가 위치

STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)

... 그리고 urls.py다음 줄에서 :

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += patterns('', (
    r'^static/(?P<path>.*)$',
    'django.views.static.serve',
    {'document_root': settings.STATIC_ROOT}
))

4. 우리는 또한 사용합니다 python manage.py collectstatic

질문 :

  1. 누구든지 저에게 워크 플로를 설명해 주시겠습니까? 일을 이상적으로 수행하는 방법입니다. 지금은 위의 코드 조각을 지정된 위치에 복사 / 붙여 넣기하고 정적 디렉터리에 새 파일을 계속 생성하면 작동합니다. 그러나 내에서는 settings.STATIC_ROOT다른 디렉토리를 가리 켰습니다.

  2. 누군가가 각 설정의 워크 플로를 설명 할 수 있다면 좋을 것입니다. 파일을 수집하고 관리하는 방법과 따라야 할 좋은 방법은 무엇일까요?

감사.


'워크 플로 설명'이 의미하는 바를 명확히 할 수 있습니까? 또한 파트 3에서 개발중인 경우 URL 패턴이 조건부이어야합니다. if settings.DEBUG:django 를 추가하여이를 수행 할 수 있습니다. 정적 미디어를 제공하는 데는 그다지 좋지 않습니다. 실제 웹 서버에 맡겨야합니다.
dm03514

안녕하세요 @ user993563 저는 제가 원하는 여러 포럼에서 솔루션을 찾을 수도 없습니다. 하지만 귀하의 질문은 분명 덕분에 남자 ... 훌륭한 일 ... 설명
모 히딘 빈 모하메드

좋은 설명, 감사합니다
Ajay Kumar

답변:


89

STATIC_ROOT

./manage.py collectstatic배포를 위해 정적 파일을 수집 할 디렉터리의 절대 경로 입니다. 예:STATIC_ROOT="/var/www/example.com/static/"

이제 명령 ./manage.py collectstatic은 모든 정적 파일 (즉, 앱의 정적 폴더, 모든 경로의 정적 파일)을 디렉토리에 복사합니다 /var/www/example.com/static/. 이제 apache 또는 nginx..etc에서이 디렉토리 만 제공하면됩니다.

STATIC_URL

URL에서 정적 파일이있는 STATIC_ROOT디렉토리 (Apache 또는 nginx..etc가) 제공됩니다. 예 : /static/또는http://static.example.com/

을 설정 STATIC_URL = 'http://static.example.com/'하면 url에서 apache 또는 nginx로 STATIC_ROOT폴더 (예 "/var/www/example.com/static/":)를 제공해야 합니다 (로 'http://static.example.com/'정적 파일 '/var/www/example.com/static/jquery.js'을 참조 할 수 있도록 'http://static.example.com/jquery.js').

이제 django-templates에서 다음과 같이 참조 할 수 있습니다.

{% load static %}
<script src="{% static "jquery.js" %}"></script>

렌더링됩니다 :

<script src="http://static.example.com/jquery.js"></script>

1
귀하의 예제와 이것 사이의 차이점은 무엇입니까 : href = "{% static"jquery.js "%}"
User

8
모두 @macdonjo {{ STATIC_URL }}jquery.js{% static "jquery.js" %}동일합니다. 즉, 둘 다 반환 /static/jquery.js됩니다. 최신 django 버전 은를 사용하는 것이 좋지만 {% static "jquery.js" %}템플릿 태그 를로드해야합니다 {% load staticfiles %}. 에 이전 장고 버전 권장{{STATIC_URL}}
suhailvs

내가 참조. 한 페이지를 제외하고 대부분의 템플릿에서 스타일 시트를로드하는 버그를 찾으려고했습니다. static방법 대신 방법으로 변경 STATIC_URL했는데 버그가 사라졌습니다. 버전을 기반으로 한 제안에 대한 좋은 전화.
사용자

37

STATICFILES_DIRS: 여기에 프로젝트의 정적 파일 (예 : 템플릿에서 사용하는 파일)을 유지할 수 있습니다.

STATIC_ROOT:이 항목을 비워두면 manage.py collectstatic시스템의 모든 정적 파일을 검색하여 여기로 이동합니다. 정적 파일 서버는 어디에 있든이 폴더에 매핑되어야합니다. collectstatic을 실행 한 후 확인하면 django가 구축 한 디렉토리 구조를 찾을 수 있습니다.

--------편집하다----------------

@DarkCygnus가 지적했듯이 STATIC_ROOT는 파일 시스템의 디렉토리를 가리켜 야하며, 폴더는 Django에 의해 채워 지므로 비어 있어야합니다.

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

또는

STATIC_ROOT = '/opt/web/project/static_files'

-------- 편집 종료 -----------------

STATIC_URL: '/ static /'은 일반적으로 괜찮습니다. 정적 파일의 접두사입니다.



2
STATICFILES_DIRS정적 파일에 대한 추가 디렉토리 역할을해야합니다. 모든 css / js / images를 APP_NAME / static / APP_NAME 폴더에 넣으면 STATICFILES_DIRS.
laike9m

답을 주셔서 감사합니다. STATIC_ROOT를 비워 두는 것에 대해 실제로 collectstatic 명령을 실행하기 전에 settings.py(를 수행 하여) 지정해야했습니다 STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles').
DarkCygnus

흠, 이것이 얼마나 쉽게 오해의 소지가 있는지 알 수 있습니다. 비워 두는 것은 일반적으로 빈 상태로 시작하고 파일이 없다는 것을 의미합니다. 혼란을 없애기 위해 답변을 업데이트하겠습니다.
keni

2

위의 모든 답변은 도움이되었지만 내 문제를 해결하지 못했습니다. 내 프로덕션 파일에서 내 STATIC_URL은 https://<URL>/static내 dev settings.py 파일에서 동일한 STATIC_URL을 사용했습니다.

이로 인해 django / conf / urls / static.py에서 자동 실패가 발생합니다.

테스트 elif not settings.DEBUG or '://' in prefix: 는 URL에서 '//'를 선택하고 정적 URL 패턴을 추가하지 않으므로 정적 파일을 찾을 수 없습니다.

Django가 http(s)://with를 사용할 수 없다는 오류 메시지를 뱉어내는 것이 좋습니다.DEBUG = True

STATIC_URL을 '/ static /'으로 변경해야했습니다.

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