質問

今、このような構造の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]

return の代わりに yield で動作するようにこれを変更する方法を知っている人がいるかどうか疑問に思っていました。一度完了するだけでなく、ユーザーにとってページの読み込みが速くなります。

ただし、リストの出力をスワップしてapplication()で生成するたびに、エラーがスローされます:

TypeError: sequence of string values expected, value of type list found
役に立ちましたか?

解決

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

リストは既に反復子であり、それ自体で生成される可能性があるため。

他のヒント

絶対に必要な場合を除き、「収量」を避ける必要があることに注意してください。特に、多くの小さな文字列を生成する場合、「yield」は非効率になります。これは、WSGI仕様では、各文字列が生成された後、応答をフラッシュする必要があるためです。 Apache / mod_wsgiの場合、フラッシュとは、Apache出力バケット旅団およびフィルターシステムを介してソケットに各文字列が押し出されることを意味します。 Apache出力フィルターシステムのオーバーヘッドを無視すると、ソケットに多数の小さな文字列を書き込むことは、単に悪いことです。

この問題は、配列内の各文字列間でもフラッシュを実行する必要があるため、文字列の配列がアプリケーションから返される場合にも発生します。これは、文字列がリストではなく反復可能なものとして扱われるためです。したがって、事前に作成された文字列のリストの場合、個々の文字列を1つの大きな文字列に結合し、その1つの文字列のみを含むリストを返すことをお勧めします。これにより、WSGI実装は、明示的に指定されていない場合、応答のContent-Lengthを自動的に生成することもできます。

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

コンテンツの長さを送信せず、出力を送信します。 単に知らない場合、出力のサイズを知る必要はありません。 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 サブセクションへのリンクのページグローバルデータ構造を構築する必要がある ページの上部に表示されるため、最後のサブセクションをレンダリングする必要があります 出力の最初のチャンクがクライアントに配信される前。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top