【问题标题】:Python Handlers.pyPython 处理程序.py
【发布时间】:2011-07-31 17:51:51
【问题描述】:

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

我有一个来自提琴手的请求,经过处理并返回给提琴手。我目前只尝试返回成功代码... 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() 定义的前几行是...

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

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

此时数据的类型为“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 应用引擎 Response 对象的 wsgi_write 响应,我出于自己的目的借用和操作了它。我真的不确定响应中的 unicode 内容。我会很感激任何指针......我确实尝试过转换它,但我显然有一些错误?!

【问题讨论】:

  • 你为什么要写一个伪堆栈跟踪,而不是包含实际的堆栈跟踪,这会更有用?

标签: python google-app-engine wsgi


【解决方案1】:

当然 write 应该在抛出这个异常之前尝试转换为字节?!?

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

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

谁能说明我做错了什么!??!

是的,正如错误告诉你的那样:客户端应该发送一个字节实例,而不是一个 str 实例(或者更好的是,返回一个可迭代而不是使用 write())。我对您的代码感到有些困惑,您显然在编写字符串之前将其转换为字节,除非它已经是字节,在这种情况下您将其转换为字符串!?

【讨论】:

  • 对不起...我是 python 新手-我同意 write 需要一个字节流... write(bytes(body)) 不会为我执行转换吗?!
  • @0909EM: 是的,虽然body.encode(encoding) 通常是首选,这是您在代码中较高级使用的。你知道你的代码是做什么的吗?我当然不会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
相关资源
最近更新 更多