2014-01-11 190 views
8

我想实现我自己的wsgiref版本的学习目的,我在这里结束了。Wsgiref错误:AttributeError:'NoneType'对象没有'分裂'属性

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,我得到属性错误。

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

我在哪里离开错误?

堆栈跟踪

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' 
+0

我试过你的代码,它没有错误地执行。你可以发布完整的堆栈跟踪吗? – skoll

+0

请发布'AttributeError'的完整堆栈跟踪。 – Keeler

+0

@skoll,运行服务器后需要访问该页面。 – falsetru

回答

3

这个怎么样,你需要yield输出比它返回。

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

不适用于我 – Kumait

+0

你会得到什么错误? – ajkumar25

+0

同样的错误,我想我的情况是什么问题,它与Python 3字符串有关,请参阅我的答案 – Kumait

5

DemoApp被调用;使用返回值DemoApp.__init__

DemoApp.__init__什么也没有返回(你不能在构造函数中返回任何东西)。

尝试以下,而不是DemoApp类:

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

使用类(使用__call__而不是__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() 
+0

我知道这一点,这也给文档。如何使用类来编写它? – ajkumar25

7

你应该返回的身体编码成UTF-8

return ["Hello World".encode("utf-8")] 

此代码工作正常在我身边,我使用Python 3.3.3:

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

加入.encode("utf-8")解决对我来说问题Python 3.4.2

相关问题