[Django] N0c Storage protocole S3 et Media files

#1
Bonjour bonjour !
En reprenant le développement d'une application Django, je me suis aperçu que la façon dont était traité les fichiers déposés sur le site était mauvaise.
La configuration, MEDIA_URL/MEDIA_ROOT, déposée les fichiers dans le dossier des statics, ce qui n'est pas du tout une bonne pratique !

Du coup, je voudrais profiter du service n0c storage pour y déposer mes fichiers uploader. (seulement les media files)

Donc je copie le dossier média dans le dossier public de N0c et ajoute les variables dans mon settings avec les informations de connexion.
j'install le paquet https://django-storages.readthedocs.io/en/latest/.

Python:
# n0c - Storage
AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")
AWS_S3_ENDPOINT_URL = os.getenv("AWS_S3_ENDPOINT_URL")
AWS_S3_REGION_NAME = os.getenv("AWS_S3_REGION_NAME")
AWS_STORAGE_BUCKET_NAME = os.getenv("AWS_STORAGE_BUCKET_NAME")
AWS_S3_CUSTOM_DOMAIN = os.getenv("AWS_S3_CUSTOM_DOMAIN")
# AWS_LOCATION = os.getenv("AWS_LOCATION")
AWS_DEFAULT_ACL = 'public-read'
# DEFAULT_FILE_STORAGE ='storages.backends.s3.S3Storage'
DEFAULT_FILE_STORAGE ='storages.backends.s3boto3.S3Boto3Storage'
# MEDIA_ROOT = ''
MEDIA_URL = f'{url}/n0c-storage/media/'

Jusque-là, tout a bien et il est possible de voir les fichiers !

Cependant,
il est impossible d'uploader les fichiers.
J'écume Internet pour trouver une information ou un bout de documentation qui pourrait aider. Pour l'instant juste une grosse migraine xD.
Quand on valide le formulaire, il n'y a aucun retour ou erreur dans la console (en local).

Bash:
[13/Oct/2024 11:04:49] "POST /admin/project/2/change/ HTTP/1.1" 302 0
[13/Oct/2024 11:04:49] "GET /admin/project/ HTTP/1.1" 200 14861

Est-ce que quelqu'un a une piste a suivre ? Une doc? un Tuto?
A votre bon cœur =D
 
#2
Après quelques modifications du settings et de mes models.

Python:
STORAGES = {
    "default":{
        "BACKEND": "storages.backends.s3.S3Storage",
    },
    "staticfiles": {
        "BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
    }
}

STATIC_URL = "/static/"

# n0c - Storage
AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")
# AWS_S3_ENDPOINT_URL = os.getenv("AWS_S3_ENDPOINT_URL")  <-- cette variable retourne aussi une erreur
AWS_STORAGE_BUCKET_NAME = os.getenv("AWS_STORAGE_BUCKET_NAME")
S3_CUSTOM_DOMAIN = os.getenv("S3_CUSTOM_DOMAIN")
AWS_S3_CUSTOM_DOMAIN=f'{AWS_STORAGE_BUCKET_NAME}.{S3_CUSTOM_DOMAIN}'
AWS_LOCATION='media'
AWS_S3_REGION_NAME = None
AWS_S3_FILE_OVERWRITE = False
MEDIA_URL = f'{domain}/n0c-storage/media/'
J'ai le droit a un beau 403 : forbidden !

botocore.exceptions.ClientError: An error occurred (403) when calling the HeadObject operation: Forbidden

Une piste ? comment gère t-on les droits de storage/public? a-t-on la main sur la "bucket policy"?
 
Dernière édition:
Haut