wsgiref “write() argument must be a bytes instance“ 错误解决

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而不是去修改源码

以上代码大部分引用别人的,原文找不到了,还请见谅

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值