Python Handlers.py

Python Handlers.py,python,google-app-engine,wsgi,Python,Google App Engine,Wsgi,我正在编写自己的WSGI简单服务器。我希望能够向它发送一些请求,并返回一些响应 我有一个来自fiddler的请求,得到处理并返回给fiddler。我目前只想返回一个成功代码。。。Fiddler得到了200个成功/OK的回复,这很好。但是当我看python时,它抛出了一个断言失败!救命啊!我如何避免断言 我的调用堆栈最终会运行 --> socketserver.py - handle_request_noblock --> socketserver.py - process_reque

我正在编写自己的WSGI简单服务器。我希望能够向它发送一些请求,并返回一些响应

我有一个来自fiddler的请求,得到处理并返回给fiddler。我目前只想返回一个成功代码。。。Fiddler得到了200个成功/OK的回复,这很好。但是当我看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()定义中的前几行是

此时,数据的类型为“str”。当然,write应该在抛出此异常之前尝试转换为字节?!?我真的被这激怒了

谁能告诉我我做错了什么

// 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()
我唯一能想到的是来自google app engine response对象的wsgi_write响应,我为了自己的目的借用并操纵了它。我真的不确定响应中的unicode内容。如果有人给我指点。。。我确实试着转换它,但我显然有些东西弄错了

当然,write应该在抛出此异常之前尝试转换为字节

不,使用服务器的用户应该在调用write()之前转换为字节,使用他们最喜欢的编码(他们也应该在头中指定)

(也就是说,他们可能根本不应该使用write,参见PEP33333。)

谁能告诉我我做错了什么

// 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()

是的,正如错误告诉您的那样:客户端应该发送字节实例,而不是str实例(或者更好,返回一个iterable,而不是使用
write()
)。我对你的代码有点迷惑,你显然在写之前把字符串转换成字节,除非它已经是字节了,在这种情况下你把它转换成字符串

为什么你要费劲写一个伪stacktrace,而不是包含实际的stacktrace,这会有用得多?对不起。。。我是python新手-我同意write需要一个字节流。。。写入(字节(正文))不为我执行转换吗@0909EM:是的,尽管
body.encode(encoding)
通常是首选,这是您在代码中使用的较高级别。你知道你的代码是做什么的吗?我当然不知道。