Pregunta

Ahora mismo tengo un script mod_wsgi que está estructurado de esta manera ...

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                    ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

Me preguntaba si alguien sabe una manera de cambiar esto para operar sobre una base de rendimiento en lugar de return , de esa manera puedo enviar la página a medida que se genera. y no solo una vez que esté completa, por lo que la carga de la página puede ser más rápida para el usuario.

Sin embargo, siempre que cambio la salida por una lista y la cedo en la aplicación (), se produce un error:

TypeError: sequence of string values expected, value of type list found
¿Fue útil?

Solución

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                    ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    yield output
  

" Sin embargo, cada vez que cambio la salida por una lista y la cedo en la aplicación (), se produce un error: "

Bueno, no cedas la lista. Cede cada elemento en su lugar:

for part in mylist:
    yield part

o si la lista es el contenido completo, simplemente:

return mylist

Debido a que la lista ya es un iterador y puede producirse por sí misma.

Otros consejos

Tenga en cuenta que debe evitarse el 'rendimiento' a menos que sea absolutamente necesario. En particular, el 'rendimiento' será ineficiente si se obtienen lotes de cadenas pequeñas. Esto se debe a que la especificación WSGI requiere que, después de cada cadena, se produzca la descarga de la respuesta. Para Apache / mod_wsgi, el lavado significa que cada cadena es forzada a salir a través de la brigada y el sistema de filtro de la cubeta de salida de Apache y en el zócalo. Ignorar la sobrecarga del sistema de filtro de salida de Apache, escribir muchas cadenas pequeñas en un socket es simplemente malo, para empezar.

Este problema también existe cuando una matriz de cadenas se devuelve desde una aplicación, ya que una descarga también debe realizarse entre cada cadena de la matriz. Esto se debe a que la cadena se trata como un iterable y no como una lista. Por lo tanto, para una lista de cadenas preformada, es mucho mejor unir las cadenas individuales en una cadena grande y devolver una lista que contenga solo esa cadena. Hacer esto también permite que una implementación de WSGI genere automáticamente una longitud de contenido para la respuesta si no se proporcionó explícitamente.

Solo asegúrese de que al unir todas las cadenas en una lista en una, el resultado se devuelva en una lista. Si esto no se hace y en su lugar se devuelve la cadena, esa cadena se trata como un iterable, donde cada elemento de la cadena es una cadena de un solo carácter. Esto se traduce en un rubor después de cada personaje, que será incluso peor que si no se hubieran unido las cuerdas.

No envíe la longitud del contenido y envíe la salida a medida que la deriva. No necesita saber el tamaño de la salida si simplemente no lo hace enviar el encabezado Content-Length. De esa manera podemos enviar parte de la respuesta. antes de que hayas calculado el resto.

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/html')]
    start_response(status, response_headers)

    yield head()
    yield part1()
    yield part2()
    yield part3()
    yield "<!-- bye now! -->"

De lo contrario, no obtendrá ningún beneficio al enviar fragmentos, ya que calcular la salida es probablemente la parte lenta y El protocolo de Internet enviará la salida en trozos de todos modos.

Lamentablemente, esto no funciona en el caso en que, por ejemplo, el cálculo de part2 () decide que realmente necesita cambiar un encabezado (como una cookie) o necesidad de construir otras estructuras de datos de página global - si esto sucede, debe calcular la salida completa antes enviando los encabezados, y también podría utilizar un return [output]

Por ejemplo, http://aaron.oirt.rutgers.edu/myapp/ docs / W1200_1200.config_template Necesita construir una estructura de datos global de página para los enlaces a subsecciones que se muestran en la parte superior de la página, por lo que la última subsección debe representarse antes de que la primera parte de la salida se entregue al cliente.

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