Python27 Flask mehrere Bilder zu einem Objekt hochladen und in DB speichern

Django, Flask, Bottle, WSGI, CGI…
Antworten
Zoja
User
Beiträge: 145
Registriert: Freitag 28. Februar 2014, 14:04

Hallo Leute,

wie stelle ich das an oder besser gesagt was ist best practise, wenn es darum geht Bilder mit Flask hochzuladen.

Ich habe Benutzer, die Zimmer hochladen können, natürlich soll ein Benutzer die Möglichkeit haben mehrere Bilder zu einem Zimmer hoch zu laden.

Diese Bilder müssen dann in der Datenbank gespeichert werden, Bilder ist hier ein Attribut von Zimmer. Das heißt, wenn ich nachher alle Zimmer von einem User sehen will, werden die Bilder als thumbnails geladen und darunter weitere Informationen, also ganz klassisch.

Nun die Bilder selbst in der DB zu speichern in der Column LargeBinaries wäre Blödsinn oder?

Ich habe etwas recherschiert und man soll mit os denn path des Bildes in die Datenbank speichern und die Bilder selbst in dem static ordner. D.h. wenn die Bilder von den Zimmern eines Users geladen werden sollen, wird aus der Datenbank eben der path benutzt und die Bilder liegen einfach auf dem Server. In diesen Ordner würden alle user ihre Bilder hochladen.

Jetzt kann der User aber mehrere Bilder hochladen, d.h ich habe mehrere Pfade, diese würde ich in einer Liste speichern, in der Datenbank müsste dann die Column eine Liste akzeptieren, solch eine Column Art gibt es aber nicht, nehme ich da einfach Column(Text ... )?

Oder ist mein Ansatz falsch?
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@Zoja: das gehört zum Datenbank 1x1 wie man eine 1:n-Beziehung abbildet. Also hier 1 Zimmer kann n Bilder haben. Der Trick ist, eine Datenbanktabelle Bilder zu erzeugen, die die Spalten Zimmer-ID und Bild-URL hat. Ein SELECT mit Zimmer-ID liefert dann alle Bilder. Natürlich kann man auch noch einen Kommentar oder Kategorie pro Bild mit in die Tabelle aufnehmen.
Meist wird aus den Bildern noch irgendein Hash generiert, aus dem dann ein Verzeichnisbaum erzeugt wird, damit nicht zu viele Dateien in einem Verzeichnis landen, also nach der Struktur /static/images/05/A7/IMG_002342.jpg bzw. /static/images/05/A7/IMG_002342_thumb.jpg.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Wo du Bilder am besten speicherst hängt davon ab wie dein Deployment aussieht. Es könnte durchaus bessere Wege geben als Bilder im Dateisystem zu speichern. Wenn du Bilder einfach im Dateisystem speicherst solltest du die aber definitiv nicht in den static Ordner packen. Aus Sicherheitsgründen sollte dies gar nicht erst möglich sein. Stell sicher dass die laufende Webanwendung weder sich selbst noch irgendwelche Dateien im static Ordner verändern kann. Wenn du Bilder im Dateisystem speicherst, verwende einen seperaten Ordner nur für Uploads in dem die Anwendung Schreibrechte hat.
Zoja
User
Beiträge: 145
Registriert: Freitag 28. Februar 2014, 14:04

DasIch hat geschrieben:Wo du Bilder am besten speicherst hängt davon ab wie dein Deployment aussieht. Es könnte durchaus bessere Wege geben als Bilder im Dateisystem zu speichern. Wenn du Bilder einfach im Dateisystem speicherst solltest du die aber definitiv nicht in den static Ordner packen. Aus Sicherheitsgründen sollte dies gar nicht erst möglich sein. Stell sicher dass die laufende Webanwendung weder sich selbst noch irgendwelche Dateien im static Ordner verändern kann. Wenn du Bilder im Dateisystem speicherst, verwende einen seperaten Ordner nur für Uploads in dem die Anwendung Schreibrechte hat.
Jep mache ich auch, ich habe einen seperaten Ordner "userimg", d.h. die Bilder kommen zu "static/userimg/" rein
Zuletzt geändert von Zoja am Freitag 10. Juni 2016, 14:39, insgesamt 1-mal geändert.
Zoja
User
Beiträge: 145
Registriert: Freitag 28. Februar 2014, 14:04

Sirius3 hat geschrieben:@Zoja: das gehört zum Datenbank 1x1 wie man eine 1:n-Beziehung abbildet. Also hier 1 Zimmer kann n Bilder haben. Der Trick ist, eine Datenbanktabelle Bilder zu erzeugen, die die Spalten Zimmer-ID und Bild-URL hat. Ein SELECT mit Zimmer-ID liefert dann alle Bilder. Natürlich kann man auch noch einen Kommentar oder Kategorie pro Bild mit in die Tabelle aufnehmen.
Meist wird aus den Bildern noch irgendein Hash generiert, aus dem dann ein Verzeichnisbaum erzeugt wird, damit nicht zu viele Dateien in einem Verzeichnis landen, also nach der Struktur /static/images/05/A7/IMG_002342.jpg bzw. /static/images/05/A7/IMG_002342_thumb.jpg.
Das habe ich mir gerade auch überlegt, wenn ich "Bild" als Attribut zu der Zimmer entity nehme wird es problematisch, wenn es mehr als ein Bild ist. Eine Lösung wäre doch eine N-M Beziehung, ich habe dann eine Tabelle mit ID's von Zimmern und ID's von Bildern, d.h. ich habe dann (Zimmer_ID_1, Bild_ID_1) zusammen als primary key und kann so zu einem Zimmer viele Bilder anlegen.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@Zoja: und welche Bilder sollen sich dann ein Zimmer teilen?
Zoja
User
Beiträge: 145
Registriert: Freitag 28. Februar 2014, 14:04

Sirius3 hat geschrieben:@Zoja: und welche Bilder sollen sich dann ein Zimmer teilen?
Keine, ich frage nur, ob es auch eine Möglichkeit wäre.

Ich kann es auch so machen, dass ein Bild die Zimmer ID als fremdschlüssel nimmt. Das wäre dann 1-M.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Nimm doch einfach ein Framework, um nicht ganz so lowlevel denken zu müssen. Ein populäres ORM für Python ist SQLAlchemy. Ein Beispiel, um die von dir gewünschte OneToMany-Beziehung zu implementieren, findest du hier.

Dafür gibt es auch etwas Schönes für Flask:
http://flask-sqlalchemy.pocoo.org/latest/
Zoja
User
Beiträge: 145
Registriert: Freitag 28. Februar 2014, 14:04

snafu hat geschrieben:Nimm doch einfach ein Framework, um nicht ganz so lowlevel denken zu müssen. Ein populäres ORM für Python ist SQLAlchemy. Ein Beispiel, um die von dir gewünschte OneToMany-Beziehung zu implementieren, findest du hier.

Dafür gibt es auch etwas Schönes für Flask:
http://flask-sqlalchemy.pocoo.org/latest/
Ich benutze SQL alchemy
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Zoja hat geschrieben:
Sirius3 hat geschrieben:@Zoja: und welche Bilder sollen sich dann ein Zimmer teilen?
Keine, ich frage nur, ob es auch eine Möglichkeit wäre.

Ich kann es auch so machen, dass ein Bild die Zimmer ID als fremdschlüssel nimmt. Das wäre dann 1-M.
Das wäre aus Sicht des Zimmers eine 1:n-Beziehung, aber aus Sicht des Fotos eine 1:1-Beziehung. Oder soll auch ein Foto für mehrere Zimmer verwendet werden können? Dann lautet das Stichwort "ManyToMany".
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Zoja hat geschrieben:Ich benutze SQL alchemy
Ok. Beim Überfliegen deiner Beiträge bin ich über deine Gedanken bezüglich zusätzlicher Tabellen zum Abbilden einer Beziehung gestolpert. Das wird zwar im Hintergrund so gemacht, aber in der Welt der ORMs muss man sich darum nicht kümmern. Sowohl das Anlegen der Tabelle als auch das Abfragen der passenden Objekte werden vom ORM erledigt. Du kannst diese Thematik auf Python-Ebene ähnlich wie Listen (oder allgemeiner: Sequenzen) handhaben.

Du musst dir bloß einmal diese "X to Y"-Terminologie klargemacht haben. Das ist ja jetzt nichts, was von den Machern von SQL-Alchemy erfunden wurde, sondern diese Begriffe sind gängig für so ziemlich alle ORM-Bibliotheken (auch außerhalb von Python).
Antworten