Django collectstatic de Heroku pousse à S3 à chaque fois
j'utilise django-storages pour les fichiers statiques avec S3 (et S3BotoStorage). Lorsque je détecte static depuis ma machine locale, le comportement est comme prévu, où seuls les fichiers modifiés sont poussés à S3. Ce processus nécessite python-dateutils 1.5 pour vérifier l'heure modifiée.
Cependant, en faisant la même chose sur Heroku, tous les fichiers sont poussés indépendamment, bien que la configuration soit la même. J'ai ensuite regardé dans le temps modifié des fichiers sur Heroku lui-même, et il semble que, os.stat (static_filename).st_mtime est le même que l'Heure de la dernière poussée.
ce comportement est-il attendu? Est-ce que heroku copie autour des dossiers même quand il n'y a pas de changement de git?
6 réponses
Essayez le réglage DISABLE_COLLECTSTATIC=1
comme paramètre d'environnement pour votre application - qui devrait l'empêcher de fonctionner à chaque pression.
Voir cet article pour plus de détails - 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
j'ai trouvé que le simple fait de configurer la configuration fera l'affaire - pas besoin d'activer aussi
NB le déploiement est géré par le python Heroku buildpack, que vous pouvez voir ici - https://github.com/heroku/heroku-buildpack-python/
EDIT 1
je viens de faire un tas de tests à ce sujet, et je peux le confirmer DISABLE_COLLECTSTATIC
is indeed disable collectstatical, regardless of the user-env-compile
paramètre - je pense que c'est maintenant dans le tronc principal (mais c'est de la spéculation). Ne semble pas se soucier de ce que le cadre est-si DISABLE_COLLECTSTATIC
existe en tant que var de configuration il est utilisé.
je recommande fortement d'utiliser le paquet collectfast pour tout déploiement statique de django vers s3, que ce soit sur place ou depuis votre serveur heroku. Il ignore les dates modifiées et utilise les hachages md5, que l'api s3 fournira très rapidement, et (optionnel) la mise en cache pour faire zoomer vos déploiements statiques. Il a fallu à MES Déploiements statiques de ~10-15 minutes à < 2 minutes et ne déploie que les fichiers qui ont réellement changé.
je viens d'avoir ce même problème et j'ai contacté le soutien D'Heroku pour savoir ce qui se passe. Ma question était
j'ai rencontré un problème funky en faisant quelques déploiements. Il apparaît que sur chaque push la date de modification sur tous les fichiers est mise à jour au moment où une nouvelle push deploy/git se produit. Est-ce destiné comportement?
en considérant que Django est
collectstatic
la commande ne vérifie que la date modifiée sur les fichiers lors de l'évaluation si le fichier devrait être copié sur le support de stockage final pour les actifs statiques, cela signifie qu'à chaque nouvelle poussée, tous les fichiers sont d'abord retirés du stockage à distance (dans ce cas S3) puis rechargés. C'est à la fois un très lente et laborieuse processus en termes de bande passante consommée et de demande.
la réponse que j'ai reçue aujourd'hui de "Caio", un membre du personnel de soutien D'Heroku, était
Salut, c'est comme ça que ça marche actuellement, Oui. J'envoie vos commentaires à notre équipe d'exécution. pour voir si nous pouvons empaqueter des fichiers avec leurs dates originales.
comme confirmé par Alen, Heroku change la date de modification des fichiers lors de leur déploiement. Cependant, Amazon S3 a aussi un attribut appelé etag qui est un hachage md5 du contenu du fichier. Il est possible d'utiliser ceci pour vérifier si les fichiers ont changé au lieu de la date modifiée, comme implémenté dans c'Django extrait de.
j'ai pris ce code, je l'ai empaqueté et corrigé quelques erreurs que j'ai trouvées et je l'ai mis sur Github comme django-S3-collectstatic. Il comprend une nouvelle la gestion de la commande fasts3collectstatic
qui ne charge que de nouveaux fichiers. Consultez la page Github pour les instructions d'installation.
pourquoi ne pas exécuter collectstatic à partir de la machine locale?
python manage.py collectstatic --noinput --settings=settings.[prod]
je suis d'accord que c'est ennuyeux - il y a quelques choses que vous pouvez faire. J'annule la commande collectstatic et je la branche dans Mes paramètres de production. Ci-dessous est la commande que j'utilise:
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'
je garde ceci dans mysite / disablecollectstatic / management / commands Puis dans les paramètres de production:
INSTALLED_APPS += ('mysite.disablecollectstatic',)
vous pouvez aussi utiliser le fait Qu'Heroku fait un dry run avant d'invoquer la commande. Si elle échoue, elle ne sera pas exécutez-le, ce qui signifie que vous pourriez créer une erreur (en supprimant la racine statique dans vos paramètres, par exemple) mais cette approche me rend nerveux:
https://devcenter.heroku.com/articles/django-assets#detection