2009-06-16 9 views
3

Ich möchte dynamisch erstellte Bilder an meine Benutzer senden, wie Diagramme, Grafiken usw. Diese Bilder sind "wegwerfbare" Bilder, sie werden nur an einen Benutzer gesendet und dann zerstört, daher die "keine Dateien beteiligt".Erstellen von dynamischen Bildern mit WSGI, keine Dateien

Ich möchte das Bild direkt an den Benutzer senden, ohne es zuerst auf dem Dateisystem zu speichern.

bearbeiten: Mit PHP dies durch die Verknüpfung von einem Bild in Ihren HTML-Dateien an einen PHP-Skript, wie erreicht werden kann SO geschluckt meinen Bild-Tag:

<img src="someScript.php?param1=xyz"> 

Das Skript geschickt dann die richtigen Header (Dateityp = > jpeg usw.) an den Browser und schrieb das Bild direkt an den Client zurück, ohne es vorübergehend im Dateisystem zu speichern.

Wie könnte ich so etwas mit einer WSGI-Anwendung tun. Momentan verwende ich Pythons internen SimpleWSGI Server. Ich bin mir bewusst, dass dieser Server hauptsächlich für Demonstrationszwecke gedacht war und nicht für den tatsächlichen Gebrauch, da ihm die Multi Threading-Fähigkeiten fehlen, also bitte nicht auf mich hinweisen, das ist mir bewusst, und vorerst erfüllt er meine Anforderungen:)

Ist es wirklich so einfach wie die URL in die Image-Tags zu setzen und die Anfrage mit WSGI zu bearbeiten, oder gibt es eine bessere Vorgehensweise?

Hat jemand Erfahrung mit diesem hatte und konnte ein paar Hinweise geben mir (keine 32Bit diejenigen, bitte)

Danke,

Tom

Antwort

8

Es bezieht sich nicht auf WSGI oder PHP oder eine andere spezifische Webtechnologie.

<img src="someScript.php?param1=xyz"> 

im Allgemeinen betrachtet für url someScript.php?param1=xyz Serverdaten von Bildtyp zurückgeben sollten, und es wäre

Betrachten Sie dieses Beispiel funktionieren:

from wsgiref.simple_server import make_server 

def serveImage(environ, start_response): 
    status = '200 OK' 
    headers = [('Content-type', 'image/png')] 
    start_response(status, headers) 

    return open("about.png", "rb").read() 

httpd = make_server('', 8000, serveImage) 
httpd.serve_forever() 

hier jede URL zu serveImage zeigt ein gültiges Bild zurückgeben und Sie können es in jedem img Tag oder jedem anderen Tag verwenden, an dem ein Bild verwendet werden kann, z css oder Hintergrundbilder

Bilddaten können im laufenden Betrieb unter Verwendung vieler Bibliotheken von Drittanbietern erzeugt werden, z. PIL etc beispiels Beispiele Erzeugung von Bildern sehen dynamisch Python Imaging Library http://lost-theory.org/python/dynamicimg.html

2

YES. Es ist so einfach wie die URL in die Seite zu setzen.

<img src="url_to_my_application"> 

Und Ihre Anwendung muss nur mit dem richtigen Mimetyp zurückgegeben werden, genau wie bei PHP oder irgendetwas anderem. Einfachstes Beispiel möglich:

def application(environ, start_response): 
    data = open('test.jpg', 'rb').read() # simulate entire image on memory 
    start_response('200 OK', [('content-type': 'image/jpeg'), 
           ('content-length', str(len(data)))]) 
    return [data] 

Natürlich, wenn Sie einen Rahmen/Helfer-Bibliothek verwenden, könnte es Hilfsfunktionen, die es Ihnen leichter machen wird.

Ich möchte als eine Nebenbemerkung hinzufügen, dass Multithreading-Funktionen nicht auf einem Webserver Quintessential sind. Wenn richtig gemacht, brauchen Sie keine Threads, um eine gute Leistung zu haben.

Wenn Sie über eine gut entwickelte Ereignisschleife verfügen, die zwischen verschiedenen Anforderungen wechselt und Ihren Anforderungsbehandlungscode auf eine Threadless-freundliche Weise schreibt (indem Sie die Kontrolle so oft wie möglich an den Server zurückgeben), können Sie auch erhalten bessere Leistung als mit Threads, da sie nichts schneller laufen lassen und Overhead hinzufügen.

Siehe twisted.web für eine gute Python Webserver-Implementierung, die keine Threads verwendet.

+0

Vielen Dank für Ihre großartige Antwort, auch für die gute Info über die Threading-Sache. Ich habe die erste Antwort als die richtige gewählt, nur weil er ein bisschen schneller war als du, und die tatsächlichen Antworten auf das Problem sind fast gleich. Aber betrachte deine Antwort auch als die richtige, wenn ich zwei richtige setzen könnte, deine wäre auch einer von ihnen :) – Tom

+0

@Tom: Eigentlich war ich schneller (meine Antwort sagt gerade jetzt "antworte vor 44 Minuten" und seine eine) sagt "Ich habe vor 42 Minuten geantwortet", aber da ich meine Antwort nachträglich bearbeitet habe, glaube ich, dass sie auf der Liste steht. Außerdem habe ich anscheinend mehr Informationen in einer kleineren, klareren Antwort. Aber wie auch immer, es ist dein Ruf. – nosklo

0

Sie sollten ETAG-Header verwenden und beachten. Es ist ein CGI-Skript, nicht WSGI, aber die Ideen sind übersetzbar: sparklines source - es passiert immer dasselbe Bild für die gleichen Parameter, so dass es extreme Caching praktiziert.

Verwandte Themen