[PYTHON] [Django] Une histoire sur le fait de rester coincé dans un marais en essayant de valider un zip avec un formulaire [TDD]

Django "UnicodeDecodeError: le codec 'utf-8' ne peut pas décoder l'octet 0xbb en position 10: octet de départ invalide"

J'ai eu cette erreur lorsque j'ai essayé de télécharger et d'enregistrer un zip de plusieurs fichiers dans le FileField du formulaire. De la conclusion, il semble que le format de données qui a été lancé au moment du test était mauvais.

Cependant, je ne comprends pas qu'il soit difficile de reproduire l'erreur car elle s'efface pour une raison quelconque lorsque j'essaie de reproduire l'erreur après son passage. J'étais vraiment en difficulté ...

Solution

Lorsque vous obtenez une erreur pour la première fois,

tests.py



self.zip_error_test = File(open('tdd.zip'))
file_data = {'upload_train_file': uploadedFile }
form = DocumentForm(file_data)
form.is_valid()

Je le plie, mais ça ressemble à ça. Cela met django en colère. À propos, j'étais également en colère contre ZIP qui consolidait un fichier.

Je l'ai résolu en le changeant comme ci-dessous.

tests.py


with open("tdd.zip", mode="rb") as f:
   uploadedFile = InMemoryUploadedFile(f, "field", "tdd.zip", "application/x-zip-compressed", 100, None, content_type_extra={})
   file_data = {'field': uploadedFile }
   form = DocumentForm(request, data, file_data)
   self.assertFalse(form.is_valid(), f"error:{form.errors}/Le fichier ZIP contenant plusieurs fichiers n'a pas été validé")

Oui. Cela fonctionnera. Tu l'as fait.

Quelle était la cause?

J'ai pensé à diverses choses. Je l'ai écrit dans la validation personnalisée de forms.py en premier lieu, alors je me suis demandé si c'était la cause, Je me suis demandé si ce n'était pas bon d'apporter «clean_data», alors j'ai joué avec to_python (). Je me demandais si je pouvais enregistrer le fichier avec forms.py.

En pensant à ce qui se passerait si je le téléchargeais à partir d'un formulaire HTML au lieu de le tester soudainement

J'ai réussi. </ b>

Je pensais que c'était différent des données reçues par formulaire, j'ai donc comparé les types de données reçues par les vues et les tests. Puis

forms.py


def clean_field(self):
    print(type(self.cleaned_data['field']))

# views > django.core.files.uploadedfile.InMemoryUploadedFile
# tests > django.forms.widgets.ClearableFileInput

Wow, c’est différent.

Pour cette raison, j'ai changé le téléchargement du test par celui mentionné ci-dessus.

C'est un cas. Grâce à cela, je sens que je suis devenu plus familier avec Form. C'est la soi-disant compréhension complète. C'est Kanpeki.

Résumé

J'ai décidé d'écrire cet article après l'avoir résolu, et pour une raison quelconque, il s'est effacé lorsque j'ai écrit le code qui provoquerait à nouveau une erreur. Sérieusement un mystère. J'ai écrit que ça passe dessus

tests.py


with open("tdd.zip", mode="rb") as f:
   file_data = {'field': f}
   form = DocumentForm(request, data, file_data)
   self.assertFalse(form.is_valid(), f"error:{form.errors}/Le fichier ZIP contenant plusieurs fichiers n'a pas été validé")

Cela passera toujours. Qu'Est-ce que c'est? Tu n'as pas réussi? Tout passera sans le mode =" rb ". Pourquoi donc? Avez-vous eu une erreur? C'est vrai. Shinji.

J'utilise le code ci-dessus, pensant que cela pourrait ne plus fonctionner si je le redémarre. Si vous modifiez la classe explicitement, il n'y aura aucun problème.

C'était donc une solution au phénomène selon lequel le zip ne pouvait pas être enregistré pour une raison quelconque.

Peut-être que la semaine prochaine, je résumerai les connaissances que j'ai acquises dans ce domaine. Je m'attendais à l'avoir.

Recommended Posts

[Django] Une histoire sur le fait de rester coincé dans un marais en essayant de valider un zip avec un formulaire [TDD]
Une histoire sur la tentative d'implémentation de variables privées en Python.
[Note] Une histoire sur la tentative de remplacer une méthode de classe avec deux barres inférieures dans la série Python 3.
Une histoire sur l'implémentation d'un écran de connexion avec django
Une histoire qui nécessitait des préparatifs pour essayer de faire un tutoriel Django avec des centos simples
Je suis resté bloqué en essayant de spécifier un chemin relatif avec relative_to () en python
Une histoire sur la tentative d'introduire Linter au milieu d'un projet Python (Flask)
Une histoire sur la façon de spécifier un chemin relatif en python.
Une histoire de compétition avec un ami dans Othello AI Preparation
Une histoire sur la façon de traiter le problème CORS
Une histoire à propos d'un débutant en python coincé avec aucun module nommé'ttp.server '
L'histoire d'un débutant participant à un projet de Django de la consolidation d'équipe à la sortie du produit en 6 semaines
Une histoire d'essayer d'automatiser un chot lorsque vous cuisinez vous-même
Une histoire sur l'ajout d'une API REST à un démon créé avec Python
Une histoire sur la tentative d'exécuter plusieurs versions de Python (édition Mac)
[Django] Comment tester le formulaire [TDD]
Une histoire d'essayer d'améliorer le processus de test d'un système vieux de 20 ans écrit en C
[Petite histoire] Comment enregistrer des graphiques matplotlib dans un lot avec Jupyter
[Mémorandum] Une histoire sur l'essai du didacticiel OpenCV (reconnaissance faciale) dans un environnement Windows
L'histoire de l'abandon d'essayer de se connecter à MySQL en utilisant Heroku
Une histoire sur un débutant essayant de configurer CentOS 8 (mémo de procédure)
Une histoire sur l'apprentissage automatique avec Kyasuket
Une histoire d'essayer d'installer uwsgi sur une instance EC2 et d'échouer
[Note] Une histoire sur l'impossibilité de percer le proxy avec pip
Une histoire déroutante avec deux façons d'implémenter XGBoost en Python + notes générales
[Django] Créez un formulaire qui remplit automatiquement l'adresse à partir du code postal
Essayez de créer un site de gestion Todo en utilisant WebSocket avec Django (Swamp Dragon)
Ajouter dynamiquement des champs aux objets Form avec Django
[Python3] Une histoire bloquée avec la conversion du fuseau horaire
Comment développer une application de panier avec Django
Démarrez Django dans un environnement virtuel à l'aide de Pipenv
Une histoire sur la gestion des données binaires en Python
Histoire d'essayer d'utiliser Tensorboard avec Pytorch
Une histoire remplie de valeurs absolues de numpy.ndarray
Configurer un module avec plusieurs fichiers dans Django
Comment créer une API Rest dans Django
Une histoire qui a échoué lors de la tentative de suppression du suffixe d'une chaîne avec rstrip
Une histoire bloquée lors de la tentative de mise à niveau de la version Python avec GCE
Une histoire sur la façon dont les utilisateurs de Windows 10 ont créé un environnement pour utiliser OpenCV3 avec Python 3.5
Comment utiliser fixture dans Django pour saisir des exemples de données associés au modèle utilisateur
Une histoire d'essais et d'erreurs essayant de créer un groupe d'utilisateurs dynamique dans Slack
Une histoire sur un débutant Python essayant d'obtenir des résultats de recherche Google à l'aide de l'API
Je souhaite envoyer un message d'erreur en japonais avec le formulaire de changement de mot de passe django
Une idée fausse improbable sur la façon de spécifier un gestionnaire pour un zip téléchargé avec Lambda
Une histoire que je voulais faire une fonction comme before_action utilisée dans les rails avec django [Débutant apprend python avec un livre de référence]