2014-01-11 188 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

相關問題