[PYTHON] [Django] Eine Geschichte über das Feststecken in einem Sumpf beim Versuch, einen Reißverschluss mit einem Formular zu validieren [TDD]

Django "UnicodeDecodeError: Codec 'utf-8' kann Byte 0xbb an Position 10 nicht dekodieren: ungültiges Startbyte"

Ich habe diesen Fehler erhalten, als ich versucht habe, eine Zip-Datei mit mehreren Dateien im FileField des Formulars hochzuladen und zu speichern. Aus der Schlussfolgerung geht hervor, dass das Datenformat, das zum Zeitpunkt des Tests ausgegeben wurde, schlecht war.

Ich verstehe jedoch nicht, dass es schwierig ist, den Fehler zu reproduzieren, da er aus irgendeinem Grund behoben wird, wenn ich versuche, den Fehler nach dem Durchlaufen zu reproduzieren. Ich war wirklich in Schwierigkeiten ...

Lösung

Wenn Sie zum ersten Mal eine Fehlermeldung erhalten,

tests.py



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

Ich falte es, aber es sieht so aus. Das macht Django wütend. Übrigens war ich ähnlich wütend auf ZIP, das eine Datei konsolidierte.

Ich habe es gelöst, indem ich es wie folgt geändert habe.

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}/ZIP mit mehreren Dateien wurde nicht validiert")

Ja. Das wird funktionieren. Du hast es geschafft.

Was war die Ursache?

Ich habe über verschiedene Dinge nachgedacht. Ich habe es in erster Linie in der benutzerdefinierten Validierung von forms.py geschrieben, also habe ich mich gefragt, ob das die Ursache ist. Ich habe mich gefragt, ob es nicht gut ist, "bereinigte_Daten" zu bringen, also habe ich mit to_python () gespielt. Ich habe mich gefragt, ob ich die Datei mit forms.py speichern könnte.

Als Ergebnis der Überlegung, was passieren würde, wenn ich es tatsächlich aus einem HTML-Formular hochladen würde, anstatt es plötzlich zu testen

Ich habe bestanden. </ b>

Ich dachte, dass dies anders ist als die Daten, die vom Formular empfangen wurden, und verglich daher die Arten von Daten, die von Ansichten und Tests empfangen wurden. Dann

forms.py


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

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

Wow, das ist anders.

Aus diesem Grund habe ich den Upload für den Test auf den oben genannten geändert.

Dies ist ein Fall. Dank dessen habe ich das Gefühl, mit Form besser vertraut zu sein. Es ist das sogenannte vollständige Verständnis. Es ist Kanpeki.

Zusammenfassung

Ich habe beschlossen, diesen Artikel nach dem Lösen zu schreiben, und aus irgendeinem Grund wurde er gelöscht, als ich den Code schrieb, der erneut einen Fehler verursachen würde. Ernsthaft ein Rätsel. Ich schrieb, dass es oben geht

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}/ZIP mit mehreren Dateien wurde nicht validiert")

Dies wird immer noch vergehen. Was ist es? Hast du nicht bestanden? Alles wird ohne den mode =" rb " passieren. Warum das? Hast du einen Fehler bekommen? Das ist wahr. Shinji.

Ich verwende den obigen Code und denke, dass er möglicherweise nicht mehr funktioniert, wenn ich ihn neu starte. Wenn Sie die Klasse explizit ändern, gibt es kein Problem.

Es war also eine Lösung für das Phänomen, dass der Reißverschluss aus irgendeinem Grund nicht gespeichert werden konnte.

Vielleicht werde ich nächste Woche oder so das Formwissen zusammenfassen, das ich in dieser Angelegenheit gewonnen habe. Ich hatte erwartet.

Recommended Posts

[Django] Eine Geschichte über das Feststecken in einem Sumpf beim Versuch, einen Reißverschluss mit einem Formular zu validieren [TDD]
Eine Geschichte über den Versuch, private Variablen in Python zu implementieren.
[Hinweis] Eine Geschichte über den Versuch, eine Klassenmethode mit zwei Unterbalken in der Python 3-Serie zu überschreiben.
Eine Geschichte über die Implementierung eines Anmeldebildschirms mit Django
Eine Geschichte, die vorbereitet werden musste, wenn versucht wurde, ein Django-Tutorial mit einfachen Centos7 zu erstellen
Ich blieb stecken, als ich versuchte, einen relativen Pfad mit relative_to () in Python anzugeben
Eine Geschichte über den Versuch, Linter mitten in einem Python (Flask) -Projekt vorzustellen
Eine Geschichte darüber, wie man einen relativen Pfad in Python angibt.
Eine Geschichte über den Wettbewerb mit einem Freund in Othello AI Preparation
Eine Geschichte über den Umgang mit dem CORS-Problem
Eine Geschichte über einen Python-Anfänger, der mit dem No-Modul'http.server 'feststeckt.
Eine Geschichte über einen Anfänger, der an einem Projekt von Django vom Teambuilding bis zur Produktfreigabe in 6 Wochen teilnimmt
Eine Geschichte über den Versuch, einen Chot zu automatisieren, wenn Sie selbst kochen
Eine Geschichte über das Hinzufügen einer REST-API zu einem mit Python erstellten Daemon
Eine Geschichte über den Versuch, mehrere Python-Versionen auszuführen (Mac Edition)
[Django] So testen Sie Form [TDD]
Eine Geschichte über den Versuch, den Testprozess eines 20 Jahre alten Systems in C zu verbessern
[Kleine Geschichte] So speichern Sie Matplotlib-Diagramme in einem Stapel mit Jupyter
[Memorandum] Eine Geschichte über das Ausprobieren des OpenCV-Tutorials (Gesichtserkennung) in einer Windows-Umgebung
Die Geschichte, den Versuch aufzugeben, mit Heroku eine Verbindung zu MySQL herzustellen
Eine Geschichte über einen Anfänger, der sich bemüht, CentOS 8 einzurichten (Verfahrensnotiz)
Eine Geschichte über maschinelles Lernen mit Kyasuket
Eine Geschichte über einen Versuch, uwsgi auf einer fehlgeschlagenen EC2-Instanz zu installieren
[Anmerkung] Eine Geschichte darüber, dass es nicht möglich ist, den Proxy mit pip zu durchbrechen
Eine verwirrende Geschichte mit zwei Möglichkeiten, XGBoost in Python + zu implementieren
[Django] Erstellen Sie ein Formular, das automatisch die Adresse aus der Postleitzahl ausfüllt
Versuchen Sie, mit WebSocket mit Django (Swamp Dragon) eine Todo-Verwaltungssite zu erstellen.
Fügen Sie Formularobjekten mit Django dynamisch Felder hinzu
[Python3] Eine Geschichte, die bei der Zeitzonenkonvertierung steckt
So entwickeln Sie eine Cart-App mit Django
Starten Sie Django in einer virtuellen Umgebung mit Pipenv
Eine Geschichte über den Umgang mit Binärdaten in Python
Die Geschichte des Versuchs, Tensorboard mit Pytorch zu verwenden
Eine Geschichte voller absoluter Werte von numpy.ndarray
Konfigurieren Sie ein Modul mit mehreren Dateien in Django
So erstellen Sie eine Rest-API in Django
Eine Geschichte, die fehlgeschlagen ist, als versucht wurde, das Suffix mit rstrip aus einem String zu entfernen
Eine Geschichte, die beim Versuch, die Python-Version mit GCE zu aktualisieren, hängen blieb
Eine Geschichte darüber, wie Windows 10-Benutzer eine Umgebung für die Verwendung von OpenCV3 mit Python 3.5 erstellt haben
Verwendung von Fixture in Django zur Eingabe von Beispieldaten für das Benutzermodell
Eine Geschichte von Versuch und Irrtum beim Versuch, eine dynamische Benutzergruppe in Slack zu erstellen
Eine Geschichte über einen Python-Anfänger, der versucht, Google-Suchergebnisse mithilfe der API abzurufen
Ich möchte eine Fehlermeldung auf Japanisch mit dem Django-Passwortänderungsformular ausgeben
Ein unwahrscheinliches Missverständnis darüber, wie ein Handler für eine mit Lambda hochgeladene Zip angegeben wird
Eine Geschichte, die Django mit einer Funktion wie before_action ausführen wollte, die in Schienen verwendet wird [Anfänger lernt Python mit einem Nachschlagewerk]