3

次のようなバイトストリームがあるとします。

POST / mum / ble?q = huh
コンテンツの長さ:18
コンテンツタイプ:application / json; charset = "utf-8"
ホスト:localhost:80

["ドレミ"]

それからWSGIスタイルの「environ」dictを生成する方法はありますか?

うまくいけば、私は簡単な答えを見落としていました、そしてそれは反対の操作と同じくらい簡単に達成できます。検討:

>>> import json
>>> from webob import Request
>>> r = Request.blank('/mum/ble?q=huh')
>>> r.method = 'POST'
>>> r.content_type = 'application/json'
>>> r.charset = 'utf-8'
>>> r.body = json.dumps(['do', 're', 'mi'])
>>> print str(r) # Request's __str__ method gives raw HTTP bytes back!
POST / mum / ble?q = huh
コンテンツの長さ:18
コンテンツタイプ:application / json; charset = "utf-8"
ホスト:localhost:80

["ドレミ"]
4

1 に答える 1

5

Pythonの標準ライブラリコードを目的に再利用するのは少し注意が必要ですが(そのように再利用するようには設計されていません!-)、実行可能である必要があります。例:

import cStringIO
from wsgiref import simple_server, util

input_string = """POST /mum/ble?q=huh HTTP/1.0
Content-Length: 18
Content-Type: application/json; charset="utf-8"
Host: localhost:80

["do", "re", "mi"]
"""

class FakeHandler(simple_server.WSGIRequestHandler):
    def __init__(self, rfile):
        self.rfile = rfile
        self.wfile = cStringIO.StringIO() # for error msgs
        self.server = self
        self.base_environ = {}
        self.client_address = ['?', 80]
        self.raw_requestline = self.rfile.readline()
        self.parse_request()

    def getenv(self):
        env = self.get_environ()
        util.setup_testing_defaults(env)
        env['wsgi.input'] = self.rfile
        return env

handler = FakeHandler(rfile=cStringIO.StringIO(input_string))
wsgi_env = handler.getenv()

print wsgi_env

基本的に、リクエストハンドラーをサブクラス化して、サーバーによって通常実行される(ソケットからクライアントに構築されるなど)rfile構築プロセスを偽造する必要があります。wfileこれは完全ではないと思いますが、近いはずです。お役に立てば幸いです。

HTTPリクエストの例も修正したことに注意してください。HTTP/1.0生のリクエスト行の最後にまたは1.1がないと、aPOSTは形式が正しくないと見なされ、例外が発生し、エラーメッセージが表示されhandler.wfileます。

于 2009-06-18T03:27:59.043 に答える