Domanda

Vorrei inviare immagini create dinamicamente ai miei utenti, come grafici, grafici, ecc. Queste immagini sono "usa e getta"; immagini, verranno inviate a un solo utente e poi distrutte, quindi il "nessun file coinvolto".

Vorrei inviare l'immagine direttamente all'utente, senza prima salvarla sul file system. Con PHP questo potrebbe essere ottenuto collegando un'immagine nei tuoi file HTML a uno script PHP come:

modifica: SO ha ingoiato il mio tag immagine:

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

Lo script ha quindi inviato le intestazioni corrette (filetype = > jpeg ecc.) al browser e ha riscritto direttamente l'immagine sul client, senza salvarla temporaneamente nel file system.

Come potrei fare qualcosa del genere con un'applicazione WSGI. Attualmente sto usando il server SimpleWSGI interno di Python. Sono consapevole che questo server era principalmente destinato a scopi dimostrativi e non per un uso effettivo, in quanto privo di funzionalità multi threading, quindi per favore non segnalarmelo, ne sono consapevole, e per ora soddisfa i miei requisiti: )

È davvero semplice come inserire l'URL nei tag immagine e gestire la richiesta con WSGI, oppure esiste una pratica migliore?

Qualcuno ha avuto qualche esperienza con questo e potrebbe darmi qualche suggerimento (no 32 bit per favore)

Grazie,

Tom

È stato utile?

Soluzione

Non è correlato a WSGI o php o qualsiasi altra specifica tecnologia web. considerare

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

in generale per url someScript.php? param1 = xyz il server dovrebbe restituire dati di tipo immagine e funzionerebbe

Considera questo esempio:

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()

qui qualsiasi URL che punta a serveImage restituirà un'immagine valida e puoi usarla in qualsiasi tag img o in qualsiasi altro luogo dove è possibile utilizzare un'immagine, ad es. immagini CSS o di sfondo

I dati delle immagini possono essere generati al volo usando molte librerie di terze parti, ad es. PIL ecc ad esempio, vedere esempi di generazione dinamica di immagini mediante la libreria di imaging Python http://lost-theory.org/python/dynamicimg.html

Altri suggerimenti

YES. È semplice come inserire l'URL nella pagina.

<img src="url_to_my_application">

E la tua applicazione deve solo restituirla con il mimetype corretto, proprio come su PHP o qualsiasi altra cosa. L'esempio più semplice possibile:

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]

Naturalmente, se usi una libreria framework / helper, potrebbe avere funzioni helper che ti renderanno più facile.

Vorrei aggiungere come commento laterale che le funzionalità multi-threading non sono essenziali per un server web. Se fatto correttamente, non hai bisogno di thread per avere una buona prestazione.

Se disponi di un ciclo di eventi ben sviluppato che passa da una richiesta all'altra e scrivi il tuo codice di gestione delle richieste in modo intuitivo (restituendo il controllo al server il più spesso possibile), puoi anche ottenere prestazioni migliori rispetto all'utilizzo dei thread, dal momento che non fanno funzionare più velocemente e aggiungono costi generali.

Vedi twisted.web per una buona implementazione del web server Python che non usa thread .

Per un esempio di fantasia che utilizza questa tecnica, vedere la ferrovia BNF diagramma mini-demo WHIFF . Puoi ottenere la fonte dal download del toolkit WHIFF di wsgi.

Dovresti considerare di usare e prestare attenzione alle intestazioni ETag. È uno script CGI, non WSGI, ma le idee sono traducibili: sparkline source - it sembra restituire sempre la stessa immagine per gli stessi parametri, quindi pratica una cache estrema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top