我正在编写自己的WSGI简单服务器。我希望能够向它发送一些请求,并返回一些响应。
我有一个来自小提琴手的请求,被处理后返回给小提琴手。我目前只想返回一个成功代码...Fiddler得到了一个200 success/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 - writewrite()定义中的前几行是...
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 app engine response对象的wsgi_write响应,这是我为了自己的目的而借用和操纵的。我真的不确定响应中的unicode内容。如果有任何建议我将不胜感激..。我确实尝试过转换它,但是我显然弄错了一些东西?!
发布于 2011-08-01 04:19:26
write确实应该在抛出此异常之前尝试转换为字节吗?!?
不,那些使用你的服务器的人应该在调用write()之前转换成字节,使用他们喜欢的编码(他们也应该在头中指定)。
(也就是说,他们可能根本不应该使用write,请参阅PEP3333。)
谁能指出我做错了什么!??!
是的,正如错误所告诉您的:客户端应该发送一个字节实例,而不是一个字符串实例(或者更好的做法是返回一个迭代值,而不是使用write())。我对你的代码有点迷惑,在你的代码中,你显然是在写字符串之前将它转换成字节,除非它已经是字节了,在这种情况下,你把它转换成字符串!?
https://stackoverflow.com/questions/6891208
复制相似问题