首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Wsgiref错误: AttributeError:'NoneType‘对象没有属性’拆分‘

Wsgiref错误: AttributeError:'NoneType‘对象没有属性’拆分‘
EN

Stack Overflow用户
提问于 2014-01-11 07:05:21
回答 5查看 11.6K关注 0票数 11

为了学习目的,我试图实现我自己版本的wsgiref,最后我在这里:

代码语言:javascript
复制
from wsgiref.simple_server import make_server

class DemoApp():
    def __init__(self, environ, start_response):
        self.environ = environ
        self.start = start_response

    def __iter__(self, status):
        self.status = '200 OK'
        response_headers = [('Content-type','text/plain')]
        self.start(status, response_headers)
        return ["Hello World"]


if __name__ == '__main__':
    httpd = make_server('', 1000, DemoApp)
    print("Serving on port 1000")
    httpd.serve_forever()

当我转到端口1000时,我会得到属性错误。

代码语言:javascript
复制
AttributeError: 'NoneType' object has no attribute 'split'

我在哪里留下错误?

堆栈跟踪:

代码语言:javascript
复制
Serving on port 1000
Traceback (most recent call last):
  File "C:\Python27\lib\wsgiref\handlers.py", line 86, in run
    self.finish_response()
  File "C:\Python27\lib\wsgiref\handlers.py", line 131, in finish_response
    self.close()
  File "C:\Python27\lib\wsgiref\simple_server.py", line 33, in close
    self.status.split(' ',1)[0], self.bytes_sent
AttributeError: 'NoneType' object has no attribute 'split'
127.0.0.1 - - [11/Jan/2014 12:40:09] "GET / HTTP/1.1" 500 59
Traceback (most recent call last):
  File "C:\Python27\lib\SocketServer.py", line 295, in _handle_request_noblock
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 54469)
    self.process_request(request, client_address)
  File "C:\Python27\lib\SocketServer.py", line 321, in process_request
    self.finish_request(request, client_address)
  File "C:\Python27\lib\SocketServer.py", line 334, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "C:\Python27\lib\SocketServer.py", line 649, in __init__
    self.handle()
  File "C:\Python27\lib\wsgiref\simple_server.py", line 124, in handle
    handler.run(self.server.get_app())
  File "C:\Python27\lib\wsgiref\handlers.py", line 92, in run
    self.close()
  File "C:\Python27\lib\wsgiref\simple_server.py", line 33, in close
    self.status.split(' ',1)[0], self.bytes_sent
AttributeError: 'NoneType' object has no attribute 'split'
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-01-11 07:27:28

怎么样,您需要yield输出而不是返回它。

代码语言:javascript
复制
from wsgiref.simple_server import make_server

class DemoApp:

    def __init__(self, environ, start_response):
        self.environ = environ
        self.start = start_response

    def __iter__(self):
        status = '200 OK'
        response_headers = [('Content-type', 'text/plain')]
        self.start(status, response_headers)
        yield 'Hello world!'


if __name__ == '__main__':
    httpd = make_server('', 1000, DemoApp)
    print("Serving HTTP on port 1000...")
    httpd.serve_forever()
票数 3
EN

Stack Overflow用户

发布于 2014-05-18 12:20:37

您应该将返回的主体编码为utf-8。

代码语言:javascript
复制
return ["Hello World".encode("utf-8")]

这段代码对我来说很好,我正在使用Python 3.3.3:

代码语言:javascript
复制
from wsgiref.simple_server import make_server


def app(env, start_response):
    body = "Hello"
    status = "200 OK"
    headers = [("Content-Type", "text/plain; charset=utf-8")]
    start_response(status, headers)
    return [body.encode("utf-8")]

port = 9080
httpd = make_server("localhost", port, app)
print("Server started on port: ", port)
httpd.serve_forever()
票数 10
EN

Stack Overflow用户

发布于 2014-01-11 07:13:40

调用DemoApp;使用DemoApp.__init__的返回值。

DemoApp.__init__不返回任何内容(不能在构造函数中返回任何内容)。

尝试使用以下方法,而不是DemoApp类:

代码语言:javascript
复制
def DemoApp(environ, start_response):
    response_headers = [('Content-type','text/plain')]
    start_response('200 OK', response_headers)
    return ["Hello World"]

使用类(使用__call__而不是__iter__):

代码语言:javascript
复制
from wsgiref.simple_server import make_server

class DemoApp:
    def __call__(self, environ, start_response):
        response_headers = [('Content-type','text/plain')]
        start_response('200 OK', response_headers)
        return ["Hello World"]


if __name__ == '__main__':
    httpd = make_server('', 1000, DemoApp()) # Don't forget instantiate a class.
    #                                    ^^
    print("Serving on port 1000")
    httpd.serve_forever()
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21059640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档