django - without - Collectstatic y S3: no encontrar archivos actualizados
error while running ''$ python manage py collectstatic-- noinput (5)
Estoy usando Amazon S3 para almacenar archivos estáticos para un proyecto de Django, pero collectstatic
no encuentra archivos actualizados, solo nuevos.
He estado buscando una respuesta por años, y creo que tengo algo configurado incorrectamente. Seguí esta publicación de blog para ayudar a configurar todo.
También encontré esta pregunta que parece idéntica a mi problema, pero ya he probado todas las soluciones.
Incluso intenté usar este complemento que se sugiere en esta pregunta .
Aquí hay alguna información que podría ser útil:
settings.py
...
STATICFILES_FINDERS = (
''django.contrib.staticfiles.finders.FileSystemFinder'',
''django.contrib.staticfiles.finders.AppDirectoriesFinder'',
''django.contrib.staticfiles.finders.DefaultStorageFinder'',
)
...
# S3 Settings
AWS_STORAGE_BUCKET_NAME = os.environ[''AWS_STORAGE_BUCKET_NAME'']
STATICFILES_STORAGE = ''storages.backends.s3boto.S3BotoStorage''
S3_URL = ''http://%s.s3.amazonaws.com/'' % AWS_STORAGE_BUCKET_NAME
STATIC_URL = S3_URL
AWS_PRELOAD_METADATA = False
requisitos.txt
...
Django==1.5.1
boto==2.10.0
django-storages==1.1.8
python-dateutil==2.1
Edit1:
Me disculpo si esta pregunta es demasiado única para mis propias circunstancias como para ayudar a una gran audiencia. Sin embargo, esto ha estado obstaculizando mi productividad durante mucho tiempo y he perdido muchas horas buscando soluciones, así que estoy empezando una recompensa para recompensar a cualquiera que pueda ayudar a solucionar este problema.
Edit2:
Me encontré con un problema similar en alguna parte. Estoy en una zona horaria diferente a la ubicación de mi cubo de AWS. Si de forma predeterminada collectstatic
usa la marca de tiempo, ¿podría interferir con el proceso?
Gracias
Aquí hay algunas buenas respuestas, pero pasé un tiempo en esto hoy, así que pensé que contribuiría una más en caso de que eso ayude a alguien en el futuro. Siguiendo los consejos encontrados en otros hilos, confirmé que, para mí, esto fue causado por una diferencia en el huso horario. Mi hora de django no era incorrecta, pero estaba configurada en EST y S3 estaba configurada en GMT. En la prueba, volví a django-storage 1.1.5, que parecía tener funcionamiento collectstatic. Parcialmente debido a las preferencias personales, no estaba dispuesto a a) recuperar tres versiones de django-storage y perder cualquier posible corrección de errores ob) alterar las zonas horarias para los componentes de mi proyecto para lo que esencialmente se reduce a una función de conveniencia (aunque una importante uno).
Escribí un guión corto para hacer el mismo trabajo que el recopilatorio sin las alteraciones antes mencionadas. Necesitará un poco de modificación para su aplicación, pero debería funcionar para casos estándar si se coloca en el nivel de aplicación y ''static_dirs'' se reemplaza con los nombres de las aplicaciones de su proyecto. Se ejecuta a través de la terminal con ''python whatever_you_call_it.py -e environment_name (establezca esto en su bucket de aws).
import sys, os, subprocess
import boto3
import botocore
from boto3.session import Session
import argparse
import os.path, time
from datetime import datetime, timedelta
import pytz
utc = pytz.UTC
DEV_BUCKET_NAME = ''dev-homfield-media-root''
PROD_BUCKET_NAME = ''homfield-media-root''
static_dirs = [''accounts'', ''messaging'', ''payments'', ''search'', ''sitewide'']
def main():
try:
parser = argparse.ArgumentParser(description=''Homfield Collectstatic. Our version of collectstatic to fix django-storages bug./n'')
parser.add_argument(''-e'', ''--environment'', type=str, required=True, help=''Name of environment (dev/prod)'')
args = parser.parse_args()
vargs = vars(args)
if vargs[''environment''] == ''dev'':
selected_bucket = DEV_BUCKET_NAME
print "/nAre you sure? You''re about to push to the DEV bucket. (Y/n)"
elif vargs[''environment''] == ''prod'':
selected_bucket = PROD_BUCKET_NAME
print "Are you sure? You''re about to push to the PROD bucket. (Y/n)"
else:
raise ValueError
acceptable = [''Y'', ''y'', ''N'', ''n'']
confirmation = raw_input().strip()
while confirmation not in acceptable:
print "That''s an invalid response. (Y/n)"
confirmation = raw_input().strip()
if confirmation == ''Y'' or confirmation == ''y'':
run(selected_bucket)
else:
print "Collectstatic aborted."
except Exception as e:
print type(e)
print "An error occured. S3 staticfiles may not have been updated."
def run(bucket_name):
#open session with S3
session = Session(aws_access_key_id=''{aws_access_key_id}'',
aws_secret_access_key=''{aws_secret_access_key}'',
region_name=''us-east-1'')
s3 = session.resource(''s3'')
bucket = s3.Bucket(bucket_name)
# loop through static directories
for directory in static_dirs:
rootDir = ''./'' + directory + "/static"
print(''Checking directory: %s'' % rootDir)
#loop through subdirectories
for dirName, subdirList, fileList in os.walk(rootDir):
#loop through all files in subdirectory
for fname in fileList:
try:
if fname == ''.DS_Store'':
continue
# find and qualify file last modified time
full_path = dirName + "/" + fname
last_mod_string = time.ctime(os.path.getmtime(full_path))
file_last_mod = datetime.strptime(last_mod_string, "%a %b %d %H:%M:%S %Y") + timedelta(hours=5)
file_last_mod = utc.localize(file_last_mod)
# truncate path for S3 loop and find object, delete and update if it has been updates
s3_path = full_path[full_path.find(''static''):]
found = False
for key in bucket.objects.all():
if key.key == s3_path:
found = True
last_mode_date = key.last_modified
if last_mode_date < file_last_mod:
key.delete()
s3.Object(bucket_name, s3_path).put(Body=open(full_path, ''r''), ContentType=get_mime_type(full_path))
print "/tUpdated : " + full_path
if not found:
# if file not found in S3 it is new, send it up
print "/tFound a new file. Uploading : " + full_path
s3.Object(bucket_name, s3_path).put(Body=open(full_path, ''r''), ContentType=get_mime_type(full_path))
except:
print "ALERT: Big time problems with: " + full_path + ". I''m bowin'' out dawg, this shitz on u."
def get_mime_type(full_path):
try:
last_index = full_path.rfind(''.'')
if last_index < 0:
return ''application/octet-stream''
extension = full_path[last_index:]
return {
''.js'' : ''application/javascript'',
''.css'' : ''text/css'',
''.txt'' : ''text/plain'',
''.png'' : ''image/png'',
''.jpg'' : ''image/jpeg'',
''.jpeg'' : ''image/jpeg'',
''.eot'' : ''application/vnd.ms-fontobject'',
''.svg'' : ''image/svg+xml'',
''.ttf'' : ''application/octet-stream'',
''.woff'' : ''application/x-font-woff'',
''.woff2'' : ''application/octet-stream''
}[extension]
except:
''ALERT: Couldn/'t match mime type for ''+ full_path + ''. Sending to S3 as application/octet-stream.''
if __name__ == ''__main__'':
main()
Creo que resolví este problema. Al igual que usted, he pasado tantas horas en este problema. También estoy en el informe de errores que encontraste en bitbucket. Esto es lo que acabo de lograr.
tuve
django-storages==1.1.8
Collectfast==0.1.11
Esto no funciona en absoluto. Eliminar todo por una vez tampoco funciona. Después de eso, no puede recoger las modificaciones y se niegan a actualizar nada.
El problema es con nuestra zona horaria. S3 dirá que los archivos que tiene se modificaron por última vez más tarde que los que queremos cargar. django collectstatic no intentará copiar los nuevos en absoluto. Y llamará a los archivos "sin modificaciones". Por ejemplo, esto es lo que veo antes de mi solución:
Collected static files in 0:00:45.292022.
Skipped 407 already synced files.
0 static files copied, 1 unmodified.
Mi solución es "¡Al diablo con el tiempo modificado!". Además de los problemas de zona horaria que estamos solucionando aquí, ¿qué sucede si cometí un error y necesito retroceder? Se negará a implementar los viejos archivos estáticos y dejar mi sitio web roto.
Aquí está mi solicitud de extracción para Collectfast https://github.com/FundedByMe/collectfast/pull/11 . Todavía dejé una bandera así que si realmente quieres comprobar la hora modificada, aún puedes hacerlo. Antes de fusionarse, solo usa mi código en https://github.com/sunshineo/collectfast
¡Tienes un buen día!
--Gordon PD: Nos quedamos hasta las 4:40 am para esto. Mi día está arruinado de seguro.
Después de horas de cavar, encontré este informe de errores .
Cambié mis requisitos para volver a una versión anterior de los almacenamientos de Django.
django-storages==1.1.5
Es posible que desee considerar el uso de este complemento escrito por antonagestam en Github: https://github.com/FundedByMe/collectfast
Compara la suma de comprobación de los archivos, que es una forma garantizada de determinar cuándo ha cambiado un archivo. Es la respuesta aceptada en esta otra pregunta de : ¿Una alternativa más rápida a manage.py collectstatic (con backbone de almacenamiento s3boto) para sincronizar archivos estáticos a s3?
He mordido el mismo problema con push a S3 nuevos archivos, pero no hay problema con django o python, en mi caso soluciono este problema al eliminar mi repositorio local y clonarlo de nuevo desde mi repositorio github.