WSGIを使用して動的イメージを作成します。ファイルは含まれません

StackOverflow https://stackoverflow.com/questions/1001068

  •  05-07-2019
  •  | 
  •  

質問

チャート、グラフなど、動的に作成された画像をユーザーに送信したい。これらの画像は「使い捨て」です。画像の場合、それらは1人のユーザーにのみ送信されてから破棄されるため、「ファイルが含まれていません」

最初にファイルシステムに保存せずに、ユーザーに画像を直接送信したい。 PHPでは、HTMLファイル内の画像を次のようなPHPスクリプトにリンクすることでこれを実現できます。

編集:画像タグを飲み込んだ:

<img src="someScript.php?param1=xyz">

その後、スクリプトは正しいヘッダー(filetype =&gt; jpegなど)をブラウザーに送信し、一時的にファイルシステムに保存せずに、クライアントに直接イメージを書き戻しました。

WSGIアプリケーションでこのようなことを行うにはどうすればよいですか。現在、Pythonの内部SimpleWSGIサーバーを使用しています。このサーバーは主にデモンストレーションを目的としており、実際の使用を目的としていないことを認識しています。マルチスレッド機能がないため、これを指摘しないでください。 )

URLを画像タグに入れてWSGIでリクエストを処理するのと同じくらい簡単ですか、それともより良い練習がありますか?

これに関する経験があり、いくつかのポインタを提供できました(32ビットのものはありません)

ありがとう、

トム

役に立ちましたか?

解決

WSGI、php、またはその他の特定のWebテクノロジーとは関係ありません。検討する

<img src="someScript.php?param1=xyz">

一般にurl someScript.php?param1 = xyz サーバーは画像タイプのデータを返す必要がありますが、動作します

この例を検討してください:

from wsgiref.simple_server import make_server

def serveImage(environ, start_response):
    status = '200 OK'
    headers = [('Content-type', 'image/png')]
    start_response(status, headers)

    return open("about.png", "rb").read()

httpd = make_server('', 8000, serveImage)
httpd.serve_forever()

serveImageを指すURLは有効な画像を返し、 img タグまたは画像を使用できる他のタグの場所で使用できます。 cssまたは背景画像

画像データは、多くのサードパーティライブラリを使用してオンザフライで生成できます。 PILなど たとえば、Pythonイメージングライブラリを使用して画像を動的に生成する例を参照してください http://lost-theory.org/python/dynamicimg.html

他のヒント

はい。ページにURLを置くのと同じくらい簡単です。

<img src="url_to_my_application">

そして、アプリケーションは、PHPまたは他の何かと同じように、正しいmimetypeでそれを返す必要があります。可能な限り簡単な例:

def application(environ, start_response):
    data = open('test.jpg', 'rb').read() # simulate entire image on memory
    start_response('200 OK', [('content-type': 'image/jpeg'), 
                              ('content-length', str(len(data)))])
    return [data]

もちろん、フレームワーク/ヘルパーライブラリを使用している場合、それを簡単にするヘルパー関数が含まれている可能性があります。

サイドスレッドとして、マルチスレッド機能はWebサーバーの典型ではないというコメントを追加したいと思います。正しく行われていれば、良好なパフォーマンスを得るためにスレッドは必要ありません。

異なるリクエストを切り替えるよく開発されたイベントループがあり、リクエストを処理するコードをスレッドレスフレンドリーな方法で(可能な限り頻繁にサーバーに制御を返すことで)記述する場合、。何も速く実行せず、オーバーヘッドが追加されるためです。

スレッドを使用しない優れたpython Webサーバー実装については、 twisted.web を参照してください。 。

この手法を使用した派手な例については、 BNF鉄道 図WHIFFミニデモ。ソースはWHIFF wsgiツールキットのダウンロードから取得できます。

ETagヘッダーを使用し、それに注意を払うことを検討する必要があります。 WSGIではなくCGIスクリプトですが、アイデアは翻訳可能です: sparklinesソース-itたまたま同じパラメータに対して常に同じ画像を返すため、極端なキャッシュを実行します。

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