Wsgiref Error: AttributeError: 'NoneType' object has no attribute 'split'
Question: I am trying to implement my own version of wsgiref for learning purpose and i
ended up here.

    
    
    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()
    

When i go to port 1000, i am getting the attribute error.

    
    
    AttributeError: 'NoneType' object has no attribute 'split'
    

Where i am leaving mistakes ?

Stacktrace

    
    
    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'
    


Answer: `DemoApp` is called; The return value of `DemoApp.__init__` is used.

`DemoApp.__init__` returns nothing (You can't return anything in constructor).

Try following instead of `DemoApp` class:

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

Using class (Use `__call__` instead of `__iter__`):

    
    
    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()
    

