Traceback (most recent call last):
File "C:\Users\Dmail\AppData\Local\Programs\Python\Python37\lib\wsgiref\handlers.py", line 138, in run
self.finish_response()
File "C:\Users\Dmail\AppData\Local\Programs\Python\Python37\lib\wsgiref\handlers.py", line 184, in finish_response
self.write(data)
File "C:\Users\Dmail\AppData\Local\Programs\Python\Python37\lib\wsgiref\handlers.py", line 279, in write
"write() argument must be a bytes instance"
AssertionError: write() argument must be a bytes instance
错误大致如上
意思是在write()这个方法的时候 data不是bytes类型的
下面为修改过的代码
from wsgiref.simple_server import make_server
def index(environ):
ret = environ['QUERY_STRING']
return ret.encode('utf-8')
def url_func(environ):
urls = [('/index', index(environ))]
return urls
def run_server(environ, star_response):
star_response('200 OK', [('Content-Type', 'text/html;charset=urf-8')])
url = environ['PATH_INFO']
func = None
for i in url_func(environ):
if i[0] == url:
func = i[1]
break
if func:
response = func
else:
response = b'404 not found!'
return [response, ]
def start():
'''
启动监听服务,端口9900
:return:
'''
httpd = make_server('127.0.0.1', 9900, run_server)
print('listening 9900.....')
httpd.serve_forever()
if __name__ == '__main__':
start()
当return 时response没有被编码为bytes就会报错
ret.encode('utf-8')
response = b'404 not found!'
另外 return 的格式
return [response, ]
在搜索解决方法时有人说在wsgiref\handlers.py 中184行self.write(data)前新增 data=data.encode('utf-8'),此做法不推荐,我们应该尊崇框架的做法,问题在于return 的data没有被编码造成的,是应该去检查return时的data而不是去修改源码
以上代码大部分引用别人的,原文找不到了,还请见谅