Frage

Im Moment habe ich ein mod_wsgi Skript bekommt, die so strukturiert sind ..

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]

Ich frage mich, ob jemand eine Möglichkeit kennt dies auf einer yield Basis statt return zu arbeiten zu ändern, so kann ich die Seite zu senden, wie es erzeugt wird, und nicht nur einmal, es ist vollständig, so kann die Seite Laden geht schneller für den Benutzer.

Jedes Mal, wenn ich die Ausgabe für eine Liste tauschen und es in der Anwendung ergeben (), wirft er einen Fehler:

TypeError: sequence of string values expected, value of type list found
War es hilfreich?

Lösung

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
  

"Jedes Mal, wenn ich die Ausgabe für eine Liste tauschen und es in der Anwendung ergeben (), es wirft einen Fehler:"

Nun, ergeben die Liste nicht. Ausbeute jedes Element statt:

for part in mylist:
    yield part

oder wenn die Liste ist der gesamte Inhalt, nur:

return mylist

Da die Liste ist bereits ein Iterator und kann von selbst ergeben.

Andere Tipps

Beachten Sie, dass ‚Ertrag‘ sollte wenn möglich vermieden werden. Insbesondere ‚Ertrag‘, wenn was viele kleine Strings ineffizient sein. Dies ist, weil die WSGI Spezifikation erfordert, dass nach jedem String ergab, dass die Reaktion ausgespült werden muss. Für Apache / mod_wsgi, mittels Spülung jeder Saite wird durch die Apache Ausgangseimerkette und Filtersystem und auf den Sockel herausgedrückt. Das Ignorieren der Overhead des Filtersystems Apache-Ausgang, viele kleine Saiten auf einen Sockel zu schreiben ist einfach nur schlecht zu beginnen.

Dieses Problem besteht auch dann, wenn ein Array von Strings aus einer Anwendung zurückgegeben wird, als ein Flush auch zwischen jeder Zeichenfolge in dem Array durchgeführt werden muss. Dies liegt daran, die Zeichenfolge mit als iterable und nicht eine Liste behandelt wird. So für eine vorgefertigte Liste von Strings, ist es viel besser, die einzelnen Stränge in eine große Zeichenfolge zu verbinden und eine Liste zurückzukehren nur, dass eine Zeichenfolge enthält. Dadurch kann auch eine WSGI Implementierung, um automatisch einen Content-Length für die Antwort zu erzeugen, wenn man nicht explizit angegeben wurde.

So stellen Sie sicher, dass, wenn alle Fäden in einer Liste zu einem Beitritt, dass das Ergebnis in einer Liste zurückgegeben. Wenn dies nicht getan wird und stattdessen wird die Zeichenfolge zurückgegeben, wird diese Zeichenfolge als iterable behandelt, wobei jedes Element in der Zeichenfolge ist eine einzelne Zeichenfolge. Dies führt zu einem Flush nach jedem Charakter durchgeführt werden, die als noch schlimmer sein wird, wenn die Saiten verbunden worden waren.

Sie die Inhaltslänge nicht senden und die Ausgabe senden, wie Sie es ableiten. Sie brauchen nicht auf die Größe der Ausgabe wissen, ob man einfach nicht tun die Content-Length-Header senden. Auf diese Weise kann ein Teil der Antwort senden bevor Sie den Rest davon berechnet haben.

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! -->"

Ansonsten werden Sie keinen Nutzen erhalten von in Blöcken zu senden, da die Ausgabe der Berechnung ist wahrscheinlich der langsame Teil und das Internet-Protokoll wird auf jeden Fall die Ausgabe in Blöcken senden.

Leider funktioniert das nicht in dem Fall, in dem zum Beispiel der Berechnung von Teil2 () entscheidet die Sie wirklich brauchen einen Header zu ändern (wie ein Cookie) oder müssen andere Seite globale Datenstrukturen bauen - wenn dies überhaupt der Fall ist, müssen Sie die gesamte Ausgabe berechnen, bevor Senden der Header und könnte genauso gut eine return [output]

verwenden

Zum Beispiel http://aaron.oirt.rutgers.edu/myapp/ docs / W1200_1200.config_template Muss eine Seite globale Datenstruktur für die Links zu Abschnitten bauen die zeigen, an der Spitze der Seite - so der letzte Abschnitt gemacht werden müssen bevor das erste Stück Ausgabe an den Kunden geliefert wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top