4

今、私はこのように構成された mod_wsgi スクリプトを持っています..

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]

yieldこれを の代わりにベースで動作するように変更する方法を誰かが知っているかどうか疑問に思っていましたreturn。その方法で、ページが生成されたときに送信でき、完了した後だけでなく、ページの読み込みを高速化できますユーザー。

ただし、出力をリストに交換して application() で生成すると、エラーがスローされます。

TypeError: sequence of string values expected, value of type list found
4

3 に答える 3

7
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

「ただし、出力をリストに交換して application() で生成すると、エラーがスローされます:」

まあ、リストを譲らないでください。代わりに各要素を生成します:

for part in mylist:
    yield part

リストがコンテンツ全体の場合は、次のようにします。

return mylist

リストはすでにイテレータであり、それ自体で生成できるためです。

于 2009-04-30T00:24:28.940 に答える
7

絶対に必要でない限り、'yield' は避けるべきであることに注意してください。特に、多数の小さな文字列を生成する場合、「yield」は非効率的です。これは、WSGI 仕様では、各文字列が返された後に応答をフラッシュする必要があるためです。Apache/mod_wsgi の場合、フラッシュとは、各文字列が Apache 出力バケット ブリゲードとフィルター システムを介して強制的にソケットに送られることを意味します。Apache 出力フィルター システムのオーバーヘッドを無視すると、ソケットに小さな文字列を大量に書き込むことは、そもそも単純に悪いことです。

この問題は、アプリケーションから文字列の配列が返される場合にも発生します。これは、配列内の各文字列間でフラッシュも実行する必要があるためです。これは、文字列がリストではなくイテラブルとして扱われるためです。したがって、事前に作成された文字列のリストの場合、個々の文字列を 1 つの大きな文字列に結合し、その 1 つの文字列だけを含むリストを返す方がはるかに優れています。これを行うと、明示的に提供されていない場合に、WSGI 実装が応答の Content-Length を自動的に生成することもできます。

リスト内のすべての文字列を 1 つに結合するときは、結果がリストに返されることを確認してください。これが行われず、代わりに文字列が返される場合、その文字列は iterable として扱われ、文字列の各要素は単一の文字列です。これにより、すべての文字の後にフラッシュが実行され、文字列が結合されていない場合よりもさらに悪化します。

于 2009-06-24T11:31:38.113 に答える
0

コンテンツの長さを送信せず、派生した出力を送信します。Content-Length ヘッダーを送信しないだけであれば、出力のサイズを知る必要はありません。そうすれば、残りの部分を計算する前に、応答の一部を送信できます。

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

そうしないと、出力の計算がおそらく遅い部分であり、インターネット プロトコルがとにかく出力をチャンクで送信するため、チャンクで送信しても何のメリットもありません。

悲しいことに、これは、たとえば、part2() の計算によって、ヘッダー (Cookie など) を変更する必要があるか、他のページグローバル データ構造を構築する必要があると判断された場合には機能しません。 、ヘッダーを送信する前に出力全体を計算する必要があり、return [output]

たとえばhttp://aaron.oirt.rutgers.edu/myapp/docs/W1200_1200.config_template ページの上部に表示されるサブセクションへのリンク用に、ページのグローバル データ構造を構築する必要があります。出力の最初のチャンクがクライアントに配信される前にレンダリングされます。

于 2009-05-04T18:20:40.050 に答える