Python Handlers.py - PullRequest
       12

Python Handlers.py

0 голосов
/ 31 июля 2011

Я пишу свой собственный WSGI Simple Server.Я хочу иметь возможность отправить на него несколько запросов и получить несколько ответов.

У меня есть запрос, который приходит от fiddler, обрабатывается и возвращается в fiddler.В настоящее время я ТОЛЬКО пытаюсь вернуть код успеха ... Fiddler возвращает ответ 200 успех / ОК, и это здорово.Но потом, когда я смотрю на python, он выбрасывает утверждение!Помогите!Как мне избежать утверждения!?

Мой стек вызовов заканчивается

--> socketserver.py - handle_request_noblock
--> socketserver.py - process_request
--> socketserver.py - finish_request
--> simpleserver.py - handle
--> handlers.py - run
--> handlers.py - finish_response
--> handlers.py - write

Первые несколько строк в определении write (): ...

def write(self, data):
    """'write()' callable as specified by PEP 3333"""

    assert type(data) is bytes, \
        "write() argument must be a bytes instance"

На данный момент тип данных имеет тип "str".Конечно, запись должна попытаться преобразовать в байты, прежде чем выдать это исключение?!?Я действительно доволен этим!

Может ли кто-нибудь пролить свет на то, что я делаю неправильно! ??!

// Response class based on Google WebAppEngine, Which is NOT written in Python 3
class Response(object):
.. Omitted .. (See Google AppEngine?!)
def wsgi_write(self, start_response):
    body = self.out.getvalue()
    if isinstance(body, str):
            body = body.encode('utf-8')
    elif self.headers.get('Content-Type', '').endswith('; charset=utf-8'):
            try:
                    body.decode('utf-8')
            except UnicodeError as e:

                    print('Response written is not UTF-8: %s', e)

    if (self.headers.get('Cache-Control') == 'no-cache' and not self.headers.get('Expires')):
            self.headers['Expires'] = 'Fri, 01 Jan 1990 00:00:00 GMT'
    self.headers['Content-Length'] = str(len(body))

    new_headers = []
    for header, value in self.__wsgi_headers:
            if not isinstance(value, str):
                    value = str(value)
            if ('\n' in header or '\r' in header or '\n' in value or '\r' in value):
                    value = value.replace('\n','').replace('\r','')
                    header = header.replace('\n','').replace('\r','')
            new_headers.append((header, value))

    self.__wsgi_headers = new_headers

    write = start_response('%d %s' % (self.__status, self.__wsgi_headers))
    write(bytes(body))
    self.out.close()

class WSGIApplication(object):
.. Omitted..

class Test(RequestHandler):
    def post(self):
        if self.response == None:
            print("No response")
        self.response.out.write("Success!")
        self.response.set_status(200, 'OK')

if __name__ == '__main__':
    print("Starting application")
    application = WSGIApplication([('/test', Test)])
    server = wsgiref.simple_server.make_server('', 109, application)
    server.serve_forever()

Единственное, что я могу думать, это будетответ wsgi_write от объекта Response движка приложения Google, который я позаимствовал и использовал для своих собственных целей.Я действительно не уверен в Unicode материале в ответе.Я был бы признателен за любые указатели ... Я пытался конвертировать его, но у меня явно что-то не так? *

1 Ответ

1 голос
/ 01 августа 2011

Конечно, запись должна пытаться преобразовать в байты, прежде чем выдать это исключение?!?

Нет, те, кто использует ваш сервер, должны преобразовать в байты перед вызовом write (), используя своилюбимая кодировка (которую они также должны указать в заголовке).

(Тем не менее, они, вероятно, вообще не должны использовать запись, см. PEP3333.)

Может ли кто-нибудь бросить любуюОсветите, что я делаю не так! ??!

Да, как об этом говорят ошибки: клиент должен отправлять экземпляр в байтах, а не экземпляр str (или, что лучше, вместо этого возвращать итеративный)использования write()).Я немного озадачен вашим кодом, где вы, по-видимому, преобразуете строку в байты перед ее записью, за исключением случаев, когда она уже является байтами, и в этом случае вы конвертируете ее в строку!?

...