كيفية بناء webob.Request أو WSGI "البيئى" ديكت من الخام HTTP تيار طلب بايت؟
سؤال
لنفترض لدي تيار بايت مع التالية فيه:
POST /mum/ble?q=huh Content-Length: 18 Content-Type: application/json; charset="utf-8" Host: localhost:80 ["do", "re", "mi"]
هل هناك طريقة لإنتاج الطراز WSGI "البيئى" ديكت من ذلك؟
ونأمل، لقد أغفلت إجابة سهلة، وأنه من السهل لتحقيق مثل عملية عكسية. النظر فيما يلي:
>>> 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 Content-Length: 18 Content-Type: application/json; charset="utf-8" Host: localhost:80 ["do", "re", "mi"]
المحلول
وإعادة استخدام بايثون لغرض غير صعبة بعض الشيء (لم تكن مصممة لإعادة استخدامها بهذه الطريقة! -)، ولكن يجب أن تكون قابلة للتنفيذ، منها مثلا:
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 في نهاية السطر طلب النيئة، يعتبر POST
سوء تشكيلها ويسبب استثناء ورسالة الخطأ الناتج عن handler.wfile