Domanda

In questo momento ho uno script mod_wsgi strutturato in questo modo ..

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]

Mi chiedevo se qualcuno fosse a conoscenza di un modo per cambiarlo per operare in base a yield anziché return , in questo modo posso inviare la pagina mentre viene generata e non solo una volta completato, quindi il caricamento della pagina può essere più veloce per l'utente.

Tuttavia, ogni volta che cambio l'output con un elenco e lo cedo nell'applicazione (), viene generato un errore:

TypeError: sequence of string values expected, value of type list found
È stato utile?

Soluzione

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
  

" Tuttavia, ogni volta che cambio l'output con un elenco e lo rendo nell'applicazione (), viene generato un errore: "

Beh, non cedere l'elenco. Rendi invece ogni elemento:

for part in mylist:
    yield part

o se l'elenco è l'intero contenuto, solo:

return mylist

Perché l'elenco è già un iteratore e può produrre da solo.

Altri suggerimenti

Si noti che il 'rendimento' dovrebbe essere evitato se non assolutamente necessario. In particolare, la "resa" sarà inefficiente se si producono molte stringhe di piccole dimensioni. Questo perché la specifica WSGI richiede che, dopo ogni stringa prodotta, la risposta debba essere svuotata. Per Apache / mod_wsgi, flush significa che ogni stringa viene forzata attraverso il sistema di brigata e filtro del bucket di output Apache e sul socket. Ignorando l'overhead del sistema di filtri di output di Apache, scrivere molte stringhe di piccole dimensioni su un socket è semplicemente un errore per cominciare.

Questo problema esiste anche quando viene restituita una matrice di stringhe da un'applicazione poiché è necessario eseguire anche un flush tra ciascuna stringa della matrice. Questo perché la stringa viene gestita come iterabile e non come elenco. Pertanto, per un elenco di stringhe preformato, è molto meglio unire le singole stringhe in una stringa di grandi dimensioni e restituire un elenco contenente solo quella stringa. In questo modo, un'implementazione WSGI può anche generare automaticamente una Content-Length per la risposta se non è stata fornita esplicitamente.

Assicurati solo che quando si uniscono tutte le stringhe di un elenco in uno, il risultato viene restituito in un elenco. Se ciò non viene fatto e invece viene restituita la stringa, quella stringa viene trattata come iterabile, dove ogni elemento nella stringa è una stringa di singolo carattere. Ciò si traduce in un colore dopo ogni personaggio, che sarà anche peggio che se le stringhe non fossero state unite.

Non inviare la lunghezza del contenuto e inviare l'output mentre lo si ottiene. Non è necessario conoscere la dimensione dell'output se semplicemente non lo si fa invia l'intestazione Content-Length. In questo modo è possibile inviare parte della risposta prima di aver calcolato il 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! -->"

Altrimenti non otterrai alcun vantaggio dall'invio di blocchi, poiché calcolare l'output è probabilmente la parte lenta e il protocollo Internet invierà comunque l'output in blocchi.

Purtroppo, questo non funziona nel caso in cui, ad esempio, il calcolo di part2 () decide che è necessario modificare un'intestazione (come un cookie) o necessità di costruire altre strutture di dati globali di pagine - se ciò dovesse accadere, è necessario calcolare l'intero output prima inviando le intestazioni e potrebbe anche utilizzare un return [output]

Ad esempio http://aaron.oirt.rutgers.edu/myapp/ docs / W1200_1200.config_template Deve creare una struttura di dati globale di pagina per i collegamenti alle sottosezioni che viene visualizzato nella parte superiore della pagina, pertanto è necessario eseguire il rendering dell'ultima sottosezione prima che il primo blocco di output venga recapitato al client.

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