이것은 아마도 어리석은 질문 일 것입니다. 그러나 그것은 제 머릿속을 클릭하는 것이 아닙니다.
Django에서 규칙은 앱과 관련된 모든 정적 파일 (예 : css, js)을 static 이라는 폴더에 넣는 것 입니다. 따라서 구조는 다음과 같습니다.
mysite/
manage.py
mysite/ --> (settings.py, etc)
myapp/ --> (models.py, views.py, etc)
static/
에서 mysite/settings.py
I 있습니다 :
STATIC_ROOT = 'staticfiles'
따라서 명령을 실행할 때 :
python manage.py collectstatic
staticfiles
루트 수준에서 라는 폴더를 생성합니다 (과 동일한 디렉토리 myapp/
).
이것의 요점은 무엇입니까? 내 모든 정적 파일의 복사본을 만드는 것이 아닙니까?
답변
여러 앱의 정적 파일을 단일 경로로 수집
글쎄, 하나의 Django 프로젝트 는 여러 개의 앱을 사용할 수 있습니다 . 그래서 거기에는 하나만 있지만 myapp
실제로 myapp1
는 myapp2
, 등
개별 앱 내부에서 단일 폴더로 복사하여 프런트 엔드 웹 서버 (예 : nginx)를 해당 단일 폴더로 지정 STATIC_ROOT
하고 여러 경로에서 정적 파일을 제공하도록 웹 서버를 구성하는 대신 단일 위치에서 정적 파일을 제공 할 수 있습니다. .
ManifestStaticFilesStorage가있는 영구 URL
MD5 해시에 대한주의 사항 버전의 파일 이름에 추가되는 : 그것은의 기본 동작의 일부가 아니다 collectstatic
으로,settings.STATICFILES_STORAGE
기본값 StaticFilesStorage
(그렇게하지 않는)
MD5 해시는 예를 들어 사용하도록 설정하면 시작됩니다. ManifestStaticFilesStorage
.
이 저장소의 목적은 일부 페이지가 여전히 해당 파일을 참조하는 경우 (예 : 사용자 또는 타사 프록시 서버에 의해 캐시 된 경우) 이전 파일을 계속 제공하는 것입니다. 또한 향후 페이지 방문의로드 시간을 단축하기 위해 배포 된 파일에 먼 미래의 Expires 헤더를 적용하려는 경우 매우 유용합니다.
답변
Django 정적 파일은 여러 위치에있을 수 있습니다. 여러 위치에서 올/static/img/icon.png
수있는 것처럼 제공되는 파일입니다 . 기본적으로:
FileSystemFinder
를 찾습니다img/icon.png
각각STATICFILES_DIRS
,AppDirectoriesFinder
를 찾습니다img/icon.png
에static
당신의 각 하위 폴더INSTALLED_APPS
. 이를 통해 Django Admin과 같은 라이브러리가 앱에 자체 정적 파일을 추가 할 수 있습니다.
이제 : manage.py runserver
DEBUG = 1로 실행 하는 경우에만 작동합니다 . 라이브로 전환하면 Django 프로세스는 더 이상 정적 자산을 제공하지 않습니다. Django를 사용하여 이러한 서비스를 제공하는 것은 비효율적이며이를위한 더 전문화 된 도구가 있습니다.
대신 다음과 같이해야합니다.
- 모든 앱에서 모든 정적 파일 찾기
- 그들 모두를 포함하는 단일 디렉토리 구축
- 어딘가에 업로드 (a
static
웹 서버 또는 타사 파일 저장소 디렉토리). - 웹 서버 (예 : nginx)를
/static/*
해당 디렉토리에서 직접 제공 하고 다른 요청을 Django로 리디렉션 하도록 구성합니다 .
collectstatic
배포 스크립트에 직접 연결할 수 있도록이 디렉터리를 준비하는 기성 스크립트입니다.
답변
프로덕션 설치에서 영구 URL을 원합니다. 파일 내용이 변경되지 않는 한 URL은 변경되지 않습니다.
이는 Django에서 웹 페이지를 열 때 클라이언트가 컴퓨터에 잘못된 버전의 CSS 또는 JS 파일을 가지지 않도록하기위한 것입니다. Django staticfiles는 파일 변경을 감지하고 그에 따라 URL을 업데이트하므로 CSS 또는 JS 파일이 변경되면 웹 브라우저가 새 버전을 다운로드합니다.
일반적으로 collectstatic
실행 중에 파일 이름에 MD5 해시를 추가하면 됩니다.
편집 : 여러 앱에 대한 관련 답변도 참조하십시오.
답변
사이트 내에 여러 장고 앱이있을 때 유용합니다.
collectstatic
그런 다음 모든 앱의 정적 파일을 한 곳에서 수집하여 프로덕션 환경에서 제공 할 수 있습니다.