2011-07-23 8 views
4

私は、fastcgiアプリケーションを監視するためのツールをPythonで作成しています。私がfastcgiから必要とするのは、pingとステータスページをロードすることだけです(失敗した場合は何らかのエラーを返します)。Python fastcgi client

これに対応していると思われるライブラリ(python-fasctgiバインディングから)がたくさんありますが、それらのほとんどは私の目的のために過度のものですが、その多くは追加の依存関係を生み出してしまいますパッケージングの問題。

したがって、簡単なpython fastcgi クライアントのインストール/パッケージ(rpm)またはプロジェクトと一緒に配布するのに十分な実装/ライブラリがありますか?

UPDATE:AGFへ

おかげで、私は、FastCGIのアプリに接続し、それに要求のいくつかの種類を送信することができました。これは標準のphp-fpm以上のものではありません。しかし、私はどんな場所でも反応を得ることができません:私は '/ ping'から出ようとしています。これは200 OKとボディの 'pong'で応答する必要があります。私が手に入れているのは、自分のリクエストに対して空のボディを持つ200 OK応答です。

私はこの方法でリクエストをやってる:

def _load_page(self, url): 
    """ load fastcgi page """ 
    fcgi = fcgi_client.FCGIApp(host = self.fcgi_host, port = self.fcgi_port) 
    env = { 
      'SCRIPT_FILENAME': url, 
      'QUERY_STRING': url, 
      'REQUEST_METHOD': 'GET', 
      'SCRIPT_NAME': url, 
      'REQUEST_URI': url, 
      'GATEWAY_INTERFACE': 'CGI/1.1', 
      'SERVER_SOFTWARE': 'ztc', 
      'REDIRECT_STATUS': '200', 
      'CONTENT_TYPE': '', 
      'CONTENT_LENGTH': '0', 
      'DOCUMENT_URI': url, 
      'DOCUMENT_ROOT': '/', 
      #'SERVER_PROTOCOL' : ??? 
      'REMOTE_ADDR': '127.0.0.1', 
      'REMOTE_PORT': '123', 
      'SERVER_ADDR': self.fcgi_host, 
      'SERVER_PORT': str(self.fcgi_port), 
      'SERVER_NAME': self.fcgi_host 
      } 
    ret = fcgi(env) 
    print ret 

は、私はまた、標準入力の取り扱いにFLUPクライアントを変更しなければならなかった:

# Transfer wsgi.input to FCGI_STDIN 
content_length = int(environ.get('CONTENT_LENGTH') or 0) 
s = '' 
while True: 
    chunk_size = min(content_length, 4096) 
    #s = environ['wsgi.input'].read(chunk_size) 
    content_length -= len(s) 
    rec = Record(FCGI_STDIN, requestId) 
    rec.contentData = s 
    rec.contentLength = len(s) 
    rec.write(sock) 

    if not s: break 

注一部ですs=''の代わりs = environ['wsgi.input'].read(chunk_size)を追加flupからのwsgi関連のもののいくつか。だから、それは空の標準を送信する必要があります。

さらに、flupをreturn status, headers, resultに変更しました。

私はレスポンスコードを調べましたが、これはうまくいくようです:実際には、fpmの空のボディがあります。私はwireshardとのネットワーク通信をチェックしました。それは私にとってはうまくいくようです。すべてのパラメータが転送されています。

アイデア?

UPDATE

問題はのFastCGIのparamフィルタリング機能していました:それはそうでDOCUMENT_ROOT、SCRIPT_FILENAMEなど便利なのparamsの多くをフィルタリングました。これを無効にした後、すべてうまくいっています。興味がある人々のために

、ここで変更クライアントである:https://bitbucket.org/rvs/ztc/src/6ec59525156d/src/ztc/lib/flup_fcgi_client.py、ここで使用例である:flupは主にFastCGI サーバーとして使用されているがhttps://bitbucket.org/rvs/ztc/src/6ec59525156d/src/ztc/php/fpm.py

答えて

3

、それはまた、FastCGIのクライアントが含まれています。

http://hg.saddi.com/flup-server/file/tip/flup/client/fcgi_app.py

依存関係のない単一のファイルのスタンドアロン実装であるように思われます。それは許可的なライセンスを持っています。

+0

私はfastcgiサーバーに接続することができますが、答えを得ることができません - 何らかの理由で空のボディで常に200を返します。なぜどんなアイデア? – rvs

+0

FCGIサーバーに入力を渡すのが標準入力処理のように見えるので、コメントアウトした場合は空のリクエストを送信している可能性があります。 – agf

+0

私は実際にはコメントしていませんが、空の標準入力を送信しました。私がfascgi protocol docsとphp-fpmソースコードから正しいと理解していれば、stdinはポストデータを渡すためにのみ使用され、他のすべての情報はparamsを介して渡されます。詳細を編集して質問してください。 – rvs