Django의 collectstatic의 요점은 무엇입니까?


92

이것은 아마도 어리석은 질문 일 것입니다. 그러나 그것은 제 머릿속을 클릭하는 것이 아닙니다.

Django에서 규칙은 앱과 관련된 모든 정적 파일 (예 : css, js)을 static 이라는 폴더에 넣는 것 입니다. 따라서 구조는 다음과 같습니다.

mysite/
    manage.py
    mysite/ --> (settings.py, etc)
    myapp/ --> (models.py, views.py, etc)
        static/

에서 mysite/settings.pyI 있습니다 :

STATIC_ROOT = 'staticfiles'

따라서 명령을 실행할 때 :

python manage.py collectstatic   

staticfiles루트 수준에서 라는 폴더를 생성합니다 (과 동일한 디렉토리 myapp/).

이것의 요점은 무엇입니까? 내 모든 정적 파일의 복사본을 만드는 것이 아닙니까?

답변:


72

여러 앱의 정적 파일을 단일 경로로 수집

글쎄, 하나의 Django 프로젝트 는 여러 개의 앱을 사용할 수 있습니다 . 그래서 거기에는 하나만 있지만 myapp실제로 myapp1myapp2, 등

개별 앱 내부에서 단일 폴더로 복사하여 프런트 엔드 웹 서버 (예 : nginx)를 해당 단일 폴더로 지정 STATIC_ROOT하고 여러 경로에서 정적 파일을 제공하도록 웹 서버를 구성하는 대신 단일 위치에서 정적 파일을 제공 할 수 있습니다. .

ManifestStaticFilesStorage가있는 영구 URL

MD5 해시에 대한주의 사항 버전의 파일 이름에 추가되는 : 그것은의 기본 동작의 일부가 아니다 collectstatic으로,settings.STATICFILES_STORAGE 기본값 StaticFilesStorage(그렇게하지 않는)

MD5 해시는 예를 들어 사용하도록 설정하면 시작됩니다. ManifestStaticFilesStorage .

이 저장소의 목적은 일부 페이지가 여전히 해당 파일을 참조하는 경우 (예 : 사용자 또는 타사 프록시 서버에 의해 캐시 된 경우) 이전 파일을 계속 제공하는 것입니다. 또한 향후 페이지 방문의로드 시간을 단축하기 위해 배포 된 파일에 먼 미래의 Expires 헤더를 적용하려는 경우 매우 유용합니다.


3
웹 서버가 정적 콘텐츠를 제공하는 것을 쉽게 찾을 수 있다고 말하고 싶습니다
babygame0ver

46

Django 정적 파일은 여러 위치에있을 수 있습니다. 여러 위치에서 올/static/img/icon.png 수있는 것처럼 제공되는 파일입니다 . 기본적으로:

  • FileSystemFinder를 찾습니다 img/icon.png각각 STATICFILES_DIRS,
  • AppDirectoriesFinder를 찾습니다 img/icon.pngstatic당신의 각 하위 폴더 INSTALLED_APPS. 이를 통해 Django Admin과 같은 라이브러리가 앱에 자체 정적 파일을 추가 할 수 있습니다.

이제 : manage.py runserverDEBUG = 1로 실행 하는 경우에만 작동합니다 . 라이브로 전환하면 Django 프로세스는 더 이상 정적 자산을 제공하지 않습니다. Django를 사용하여 이러한 서비스를 제공하는 것은 비효율적이며이를위한 더 전문화 된 도구가 있습니다.

대신 다음과 같이해야합니다.

  • 모든 앱에서 모든 정적 파일 찾기
  • 그들 모두를 포함하는 단일 디렉토리 구축
  • 어딘가에 업로드 (a static 웹 서버 또는 타사 파일 저장소 디렉토리).
  • 웹 서버 (예 : nginx)를 /static/*해당 디렉토리에서 직접 제공 하고 다른 요청을 Django로 리디렉션 하도록 구성합니다 .

collectstatic 배포 스크립트에 직접 연결할 수 있도록이 디렉터리를 준비하는 기성 스크립트입니다.


25

프로덕션 설치에서 영구 URL을 원합니다. 파일 내용이 변경되지 않는 한 URL은 변경되지 않습니다.

이는 Django에서 웹 페이지를 열 때 클라이언트가 컴퓨터에 잘못된 버전의 CSS 또는 JS 파일을 가지지 않도록하기위한 것입니다. Django staticfiles는 파일 변경을 감지하고 그에 따라 URL을 업데이트하므로 CSS 또는 JS 파일이 변경되면 웹 브라우저가 새 버전을 다운로드합니다.

일반적으로 collectstatic실행 중에 파일 이름에 MD5 해시를 추가하면 됩니다.

편집 : 여러 앱에 대한 관련 답변도 참조하십시오.


1
잘 했어! 그것을 알고 didnot
doniyor

"일반적으로 MD5 해시를 추가하여 달성"한다는 것은 ManifestStaticFilesStorage 를 의미 합니까? 니스, 내가 본하지 않은
코스

3
나는 더 MD5 해시는 이후이 진행되지 않습니다 기본적으로 생각 settings.STATICFILES_STORAGE디폴트 StaticFilesStorage는 MD5는 만 예를 들어이 그것을 설정 한 후에서 시작된다, 그래서 ManifestStaticFilesStorage, 내가 해결 해요?
bakkal

@MikkoOhtamaa하지만 후자가 항상 변경되기 때문에 프론트 엔드 앱은 어떤 파일 이름에 링크해야하는지 어떻게 알 수 있습니까?
lapin

@lapin 좋은 질문입니다! 당연히 1) 최신 버전에 매핑하고 2)이를 전달하는 방법이 있어야합니다. 일반적으로 어딘가에 파일에 저장되고 "최신 버전의 X에 대한 전체 URL"을 물으면 결과가 표시됩니다.
Mikko Ohtamaa 2019

10

사이트 내에 여러 장고 앱이있을 때 유용합니다.

collectstatic 그런 다음 모든 앱의 정적 파일을 한 곳에서 수집하여 프로덕션 환경에서 제공 할 수 있습니다.

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