2013-01-19 2 views
10

S3 (S3BotoStorage)가있는 정적 파일에 django-storage를 사용하고 있습니다. 내 로컬 컴퓨터에서 collectstatic을 수행하면 예상대로 동작하지만 수정 된 파일 만 S3에 푸시됩니다. 이 프로세스는 수정 된 시간을 확인하기 위해 python-dateutils 1.5가 필요합니다.Heroku의 Django collectstatic가 매번 S3에 푸시됩니다.

그러나 Heroku에서 동일한 작업을 수행하면 설정이 동일하더라도 관계없이 모든 파일이 푸시됩니다. 그런 다음 Heroku 자체에있는 파일의 수정 된 시간을 조사한 결과, os.stat (static_filename) .st_mtime은 마지막으로 푸시 한 시간과 같습니다.

이 예상되는 동작입니까? heroku는 git에서 변경이 없더라도 파일을 복사합니까?

답변

5

나는 정확하게 똑같은 문제가 있었는지 그리고 Heroku의 지원에 연락하여 무슨 일이 일어나고 있는지 알아 냈습니다. 그들에게 내 질문은

일부 배포를 수행하는 펑키 문제가 발생했습니다. 매번 누를 때마다 모든 파일에서 수정 된 날짜가 새로운 deploy/git 푸시가 발생하는 시점으로 업데이트됩니다. 이것은 의도 된 행동입니까?

Django의 collectstatic 명령은 정적 자산의 최종 저장소 백엔드로 파일을 복사해야하는지 평가할 때 파일의 수정 된 날짜 만 확인한다고 가정 할 때, 이는 새로운 누를 때마다 모든 파일이 먼저 원격 저장소 (이 경우 S3)에 저장 한 다음 다시 업로드합니다. 이것은 소비되는 대역폭과 요청의 측면에서 매우 느리고 낭비적인 프로세스입니다.

내가 "카 이오"에게 Heroku의 지원 직원 중 하나에서 오늘받은 대답은 현재 어떻게 작동하는지 그 예,의, 안녕

했다. 귀하의 의견을 런타임 팀에 전달하여 원래 날짜로 파일을 패키지화 할 수 있는지 확인합니다.

+1

또 다른 방법은 최종 수정 대신 저장소 백엔드 확인 해시를 사용하는 것입니다. S3에는 파일의 md5 인 etag가 있지만 문서화되어 있지 않다고 생각합니다. –

0

나는 이것이 성가신 것에 동의합니다. 할 수있는 일이 몇 가지 있습니다. collectstatic 명령을 무시하고 프로덕션 설정에서 연결합니다. 아래는 내가 명령을 사용한다 :

```

from django.core.management.base import BaseCommand 
class Command(BaseCommand): 
    args = '<none>' 
    help = "disables collectstatic cmd in contrib" 
    def handle(self, *args, **kwargs): 
     print 'collectstatic disabled' 

```

내가 내 사이트/disablecollectstatic/경영이 유지/제작 설정에서 다음 명령 :

INSTALLED_APPS += ('mysite.disablecollectstatic',) 

또는 실제로 명령을 실행하기 전에 Heroku가 마른 실행을 수행한다는 사실을 사용할 수 있습니다. 확인 된

https://devcenter.heroku.com/articles/django-assets#detection

+1

환경 변수 var를 설정하여 collectstatic 명령을 모두 비활성화 할 수 있습니다. 다음에 해당하는 경우 : https://devcenter.heroku.com/articles/django-assets#disabling-collectstatic –

1

: 그것은 실패하면 (아마 예를 들어, 설정에서 정적 루트를 삭제하여) 오류를 고안 수 있음을 의미하지만,이 방법은 나를 긴장하게하는, 그것을 실행되지 않습니다 Alen은 배포 할 때 Heroku가 파일의 수정 날짜를 변경합니다. 그러나 Amazon S3에는 파일 내용의 md5 해시 인 etag이라는 속성이 있습니다. this Django snippet에 구현 된 것처럼 수정 된 날짜 대신 파일이 변경되었는지 확인할 때이 방법을 사용할 수 있습니다.

나는이 코드를 패키지에 넣은 다음 발견 한 오류를 해결하고 Github에 django-s3-collectstatic으로 입력했습니다. 새 파일 만 업로드하는 새로운 관리 명령 fasts3collectstatic이 포함되어 있습니다. Github 페이지에서 설치 지침을 확인하십시오.

1

왜 로컬 시스템에서 collectstatic을 실행하지 않습니까?

python manage.py collectstatic --noinput --settings=settings.[prod] 
6

나는 강하게 지역 여부 나에게 Heroku 서버에서, S3 어떤 장고 정적 배치를위한 collectfast package를 사용하는 것이 좋습니다. 수정 된 날짜를 무시하고 s3 API가 제공하는 md5 해시 및 정적 배포를 확대 (옵션)하는 캐싱을 사용합니다. 내 정적 배포가 ~ 10-15 분에서 < 2 분이 소요되었으며 실제로 변경된 파일 만 배포합니다.

+0

고마워요! 시도해 볼 것입니다. –

15

앱의 환경 설정으로 DISABLE_COLLECTSTATIC=1을 설정해보십시오. 모든 푸시에서 실행되지 않도록 설정해야합니다.

자세한 내용은이 문서를 참조하십시오 - https://devcenter.heroku.com/articles/django-assets :

> Sometimes, you may not want Heroku to run collectstatic on your behalf. 
> You can disable collectstatic by enabling user-env-compile as well: 

$ heroku labs:enable user-env-compile 
$ heroku config:set DISABLE_COLLECTSTATIC=1 

내가 찾은을 단순히 수행하지 않습니다는 config 설정 - 그것은 이것은 생산에 실험실에서 전달했다고하는 것이 될 수있다 - 또한 user-env-compile을 활성화 할 필요 ? 난 그냥이에 대한 시험의 무리를 해봤 것을 확인할 수 1

https://github.com/heroku/heroku-buildpack-python/

편집 -

NB 배포는 여기에 볼 수있는 Heroku가 파이썬 buildpack에 의해 관리된다 DISABLE_COLLECTSTATIC 실제로는 user-env-compile 설정에 관계없이 collectstatic를 비활성화합니다. 이제는 주 트렁크에 있다고 생각합니다. (하지만 추측입니다.) 설정이 무엇인지 신경 쓰지 않는 것 같습니다 - 만약 DISABLE_COLLECTSTATIC이 설정 변수로 존재한다면 그것은 사용됩니다.

+0

내 하루가 절약되었습니다. – levi

관련 문제