Dynamisch Bilder verschicken

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
torax123
User
Beiträge: 5
Registriert: Samstag 15. Dezember 2012, 20:29

Hi.

Ich bin Python Anfänger und versuche eine kleine Webanwendwung mit Hilfe des cgi Moduls und apache zu schreiben. Ich habe einen Bereich, in dem sich nur Mitglieder einloggen können. Diese bekommen jetzt dynamisch eine Webseite geschickt, die auch Bilder enthalten soll. Ich will die Bilder allerdings nicht in einem öffentlich zugänglichen Ordner (d.h. nicht irgendwo in nem /var/www Unterverzeichnis) speichern, damit nicht eingeloggte Besucher nicht auf die Bilder zugreifen können (indem sie den Ordner öffnen).

D.h. ich kann ja jetzt nicht einfach:

Code: Alles auswählen

print "<img src='relativer/pfad/bild.png'>"
machen, sondern muss das Bild irgendwie dynamisch von meinem Server schicken z.b. von /home/bilder/beispiel.png. Ich komm aber einfach nicht drauf wie das funktionieren soll. Ich habe schon gegooglet und z.b. das hier gefunden:

Code: Alles auswählen

    sys.stdout.write('Content-Type: image/png\r\n\r\n')
    with open('/home/bastian/Desktop/schale.png', 'rb') as f:
        sys.stdout.write(f.read())
Aber damit wird mir nur erst "Content-Type: image/png" und dann "das Bild" als komische Zeichen angezeigt. Kann mir jemand helfen?
BlackJack

@torax123: Das sollte aber eigentlich funktionieren. Was machst Du denn da sonst noch?
torax123
User
Beiträge: 5
Registriert: Samstag 15. Dezember 2012, 20:29

Naja ich mach das halt innerhalb eines Skriptes. Sonst mach ich eigentlich nichts mehr. Oder was meinst du?
BlackJack

łtorax123: Ich meine das werden doch nicht die einzigen drei Zeilen sein. Wie sieht das HTML aus was Du auslieferst, wie die Verarbeitung der URL und so weiter. Steht davor zum Beispiel noch etwas was aus versehen schon Daten sendet, so dass der Header nicht mehr als solcher erkannt wird und das deshalb alles schon als Teil des Inhalts gesehen wird.
torax123
User
Beiträge: 5
Registriert: Samstag 15. Dezember 2012, 20:29

Achso ja klar. Also insgesamt ist das Skript nur eine einzige Datei. In etwa so:

Code: Alles auswählen

print "Content-type: text/html"
print
print """
<html>

<head><title>Bewerber</title></head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<body>
....
</body>
</html>
"""
    print
    print
    sys.stdout.write('Content-Type: image/png\r\n\r\n')
    with open('/home/bastian/Desktop/schale.png', 'rb') as f:
        sys.stdout.write(f.read())
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@torax123: und was steht bei Dir in der ersten Zeile?
Dort wird schon ein http-Header geschrieben sowie eine ganze html-Seite.

Du darfst entweder Deine drei letzten Zeilen für ein Bild,
oder eine ganz normale html-Seite ausgeben, aber nicht beides gleichzeitig.
torax123
User
Beiträge: 5
Registriert: Samstag 15. Dezember 2012, 20:29

Achso ganz am Anfang steht noch:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import cgitb; cgitb.enable()
import cgi, MySQLdb, sys
@Sirius: Und wie mach ich das dann am besten? Das Bilder rausschicken in ein eigenes Skript packen?
BlackJack

@torax123: Ob Du das im selben Skript oder einem anderen machst ist eigentlich egal es muss halt eine Abfrage/Antwort pro ”Datei” sein. Du kannst auf eine Anfrage nur eine Sache ausliefern.
torax123
User
Beiträge: 5
Registriert: Samstag 15. Dezember 2012, 20:29

Hmm also das Grundproblem ist ja, dass nur eingeloggte Benutzer Bilder sehen können sollen. D.h. wenn man nicht eingeloggt ist, soll es auch nicht möglich sein über eine direkte Eingabe der Bild-URL auf diese Bilder zuzugreifen. Wie mach ich das denn? Geht mein Ansatz überhaupt in die richtige Richtung?
BlackJack

@torax123: Dann musst Du zum Beispiel mit Session-IDs und/oder Cookies arbeiten. Da würde ich aber langsam überlegen ob so eine Low-Level-Schnittstelle wie CGI das richtige ist und man nicht lieber ein Webrahmenwerk verwendet. Für WSGI gibt es Middleware für Sitzungen und grössere Rahmenwerke wie Django bringen in der Regel sogar etwas für eine Rechteverwaltung mit.
Antworten