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실제로 myapp1는 myapp2, 등

개별 앱 내부에서 단일 폴더로 복사하여 프런트 엔드 웹 서버 (예 : 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.png에 static당신의 각 하위 폴더 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.