كيفية بناء webob.Request أو WSGI "البيئى" ديكت من الخام HTTP تيار طلب بايت؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

لنفترض لدي تيار بايت مع التالية فيه:

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top