[Django] N0c Storage protocole S3 et Media files

lessy69

New Member
#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
 

lessy69

New Member
#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:

PH-Brendan.M

Administrator
Membre du personnel
#3
Bonjour,

Afin de mieux répondre à cette question pourriez-vous ouvrir un billet de support depuis votre compte SVP?
 

lessy69

New Member
#4
Après de l’investigation et l'aide du support: on a trouvé une bonne configuration pour connecter une application héberger sur les serveur de planethoster et n0c Storage.

La configuration ne fonctionne pas en local à première vue, mais j'ai voulu ce changement pour mes applications en production.
L'ajout d'un logger (import logging) a bien aider pour le coup.
En prenant en compte la documentation de django-storage et les conseils du support PH voici une partie de mon fichier settings.py


Python:
# autoriser n0c
ALLOWED_HOSTS = ["www.mon_domain.fr"," ht2-storage.n0c.com"]

# Parametrage Static dans l'app django et Media en S3
STATIC_URL = "/static/"
STATIC_ROOT = BASE_DIR / "static"
MEDIA_ROOT = ""  # Laissez vide car les fichiers seront stockés sur S3
MEDIA_URL = "https://www.mon_domain.fr/n0c-storage/sous_dossier_dans_public/"
STORAGES = {
    "default":{
        "BACKEND": "storages.backends.s3.S3Storage",
        "OPTIONS": {
            "access_key": os.getenv("ACCESS_KEY_ID"),
            "secret_key": os.getenv("SECRET_ACCESS_KEY"),
            "bucket_name": os.getenv("STORAGE_BUCKET_NAME"),
            "default_acl": None,
            "file_overwrite": False,
            "location":"public/media",
            "region_name": None,
            "use_ssl": True,
            "endpoint_url": os.getenv("S3_ENDPOINT_URL"),
            "addressing_style": "path",
            "custom_domain": f"{os.getenv('STORAGE_BUCKET_NAME')}.{os.getenv('S3_CUSTOM_DOMAIN')}/",
            "signature_version":"s3v4",
            "object_parameters":{
                'CacheControl': 'max-age=86400',
            },
        }
    },
    "staticfiles": {
        "BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
    }
}
Cela fonctionne correctement de mon coté.
Les informations sont renseignés dans l’écran :

1729322577950.png

J'espère que cela aidera !
 
Dernière édition:
Haut