2014-01-11 32 views
8

私は自分のバージョンのwsgirefを学習目的で実装しようとしています。Wsgirefエラー:AttributeError: 'NoneType'オブジェクトに 'split'属性がありません

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' 

私は間違いを犯していますか?

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' 
+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__は何も返しません(コンストラクタで何も返すことはできません)。

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

クラス(代わりに__iter__の利用__call__)使用:

DemoAppクラスの代わりに、次の試してみてください、この程度

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

私はこれを知っています、これはまたdocsも与えられています。クラスを使って書く方法は? – ajkumar25

7

あなたはUTF-8

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

に戻って体をエンコードする必要があります。このコードは、私と一緒に正常に動作し、私は、Python 3.3.3を使用しています:

.encode("utf-8")が解決追加
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

私にとって問題Python 3.4.2

関連する問題