Skip to content

WSGI server i błąd: WSGI Applications must yield bytes

Dzisiaj przy okazji pewnej pracy przenosiłem skrypt w Python 2.7 do Python 3.5. W sumie nie było to nic specjalnego, głównie należało zmieniać print’y, lecz w pewnym momencie zauważyłem, że kod wywołania wsgiserver generuje ciągły błąd:

Traceback (most recent call last):
  File "/lib/python3.5/site-packages/wsgiserver.py", line 1394, in communicate
    req.respond()
  File "/lib/python3.5/site-packages/wsgiserver.py", line 848, in respond
    self.server.gateway(self).respond()
  File "/lib/python3.5/site-packages/wsgiserver.py", line 2347, in respond
    raise ValueError("WSGI Applications must yield bytes")
ValueError: WSGI Applications must yield bytes

ValueError: WSGI Applications must yield bytes

Standardowo opis WSGIServer mówi, że należy użyć następującego kodu:

def my_app(environ, start_response):
    status = '200 OK'
    response_headers = [('Content-type','text/plain')]
    start_response(status, response_headers)
    return 'WSGIserver is running!'

Jednak okazało się, że zgodnie z opisem błędu, należy zwracać bajty, zatem poprawny kod wyglądałby tak:

def my_app(environ, start_response):
    status = '200 OK'
    body = b'WSGIserver is running!'
    response_headers = [('Content-type','text/plain')]
    start_response(status, response_headers)
    return [body]

Zwracam uwagę na zmienną body – która definiuje bytes…

W dokumencie PEP-3333 jest ciekawy zapis:

Where you see references to „bytestring”, this should be read as „an object of type bytes
under Python 3, or type str under Python 2″.

Zatem przyjąłem przekodowywanie str na bytes, a oto moja implementacja:

Published inPython 3Założone przykłady

Be First to Comment

Dodaj komentarz