2011-07-23 71 views
4

我在python上編寫了一個監視fastcgi應用程序的工具。我需要從fastcgi中唯一需要加載ping和狀態頁面(如果失敗返回某種錯誤)。Python fastcgi客戶端

有很多庫(從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過濾功能:它過濾掉了很多有用的PARAMS像DOCUMENT_ROOT,SCRIPT_FILENAME等等。禁用此功能後,一切正常。

任何有興趣,這裏是修改的客戶機:https://bitbucket.org/rvs/ztc/src/6ec59525156d/src/ztc/lib/flup_fcgi_client.py,這裏是使用例如:https://bitbucket.org/rvs/ztc/src/6ec59525156d/src/ztc/php/fpm.py

回答

3

雖然flup主要用作一個的fastcgi 服務器,它也包括一個fastcgi的客戶端。

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

這似乎是一個單獨的文件獨立執行,沒有依賴性。它有一個許可證。

+0

嗯,更改一些代碼後(註釋的標準輸入處理)我能夠連接到fastcgi服務器,但無法得到答案 - 它總是返回200與空身體出於某種原因。任何想法爲什麼? – rvs

+0

在我看來,stdin處理是將輸入傳遞給FCGI服務器的原因,因此如果您已經發表了評論,那麼您可能會發送一個空請求。 – agf

+0

我其實沒有評論,但只是發送空的標準輸入。如果我理解正確(從fascgi協議文檔和php-fpm源代碼),stdin僅用於傳遞發佈數據,所有其他信息都通過params傳遞。請更詳細地編輯問題。 – rvs