Pregunta

Me gustaría enviar imágenes creadas dinámicamente a mis usuarios, como cuadros, gráficos, etc. Estas imágenes son " desechables " imágenes, solo se enviarán a un usuario y luego se destruirán, de ahí la " no hay archivos involucrados " ;.

Me gustaría enviar la imagen directamente al usuario, sin guardarla primero en el sistema de archivos. Con PHP, esto podría lograrse vinculando una imagen de sus archivos HTML a un script PHP como:

editar: SO tragó mi etiqueta de imagen:

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

El script luego envió los encabezados correctos (filetype = > jpeg, etc.) al navegador y escribió la imagen directamente al cliente, sin guardarla temporalmente en el sistema de archivos.

¿Cómo podría hacer algo así con una aplicación WSGI? Actualmente estoy usando el servidor interno SimpleWSGI de Python. Soy consciente de que este servidor fue principalmente para fines de demostración y no para uso real, ya que carece de capacidades de subprocesos múltiples, por lo que no me lo señale, lo sé y por ahora cumple con mis requisitos: )

¿Es realmente tan simple como poner la URL en las etiquetas de imagen y manejar la solicitud con WSGI, o hay una mejor práctica?

¿Alguien ha tenido alguna experiencia con esto y podría darme algunos consejos (no 32 bits por favor)

Gracias,

Tom

¿Fue útil?

Solución

No está relacionado con WSGI o php ni con ninguna otra tecnología web específica. considerar

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

en general para url someScript.php? param1 = xyz el servidor debería devolver datos del tipo de imagen y funcionaría

Considere este ejemplo:

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

aquí, cualquier URL que apunte a serveImage devolverá una imagen válida y puede usarla en cualquier etiqueta img o en cualquier otro lugar de etiqueta donde se pueda usar una imagen, por ejemplo. css o imágenes de fondo

Los datos de imagen se pueden generar sobre la marcha utilizando muchas bibliotecas de terceros, p. PIL, etc. ver ejemplos de generar imágenes dinámicamente usando la biblioteca de imágenes de Python http://lost-theory.org/python/dynamicimg.html

Otros consejos

SI. Es tan simple como poner la url en la página.

<img src="url_to_my_application">

Y tu aplicación solo tiene que devolverla con el mimetype correcto, al igual que en PHP o cualquier otra cosa. El ejemplo más simple posible:

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]

Por supuesto, si usa un framework / biblioteca auxiliar, podría tener funciones auxiliares que lo harán más fácil para usted.

Me gustaría agregar como comentario adicional que las capacidades de subprocesamiento múltiple no son esenciales en un servidor web. Si se hace correctamente, no necesita hilos para tener un buen rendimiento.

Si tiene un ciclo de eventos bien desarrollado que cambia entre diferentes solicitudes y escribe su código de manejo de solicitudes de una manera amigable (devolviendo el control al servidor tan a menudo como sea posible), puede obtener incluso mejor rendimiento que usar subprocesos, ya que no hacen que nada se ejecute más rápido y agregan gastos generales.

Consulte twisted.web para obtener una buena implementación del servidor web de Python que no utiliza subprocesos .

Para ver un ejemplo sofisticado que utiliza esta técnica, consulte el ferrocarril BNF diagrama WHIFF mini-demo . Puede obtener la fuente de la descarga del kit de herramientas WHIFF wsgi.

Debería considerar usar y prestar atención a los encabezados ETag. Es una secuencia de comandos CGI, no WSGI, pero las ideas son traducibles: fuente de sparklines - Sucede que siempre devuelve la misma imagen para los mismos parámetros, por lo que practica un almacenamiento en caché extremo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top