2016-04-08 10 views
1

Ich versuche, den WebSocket-Beispiel-Code aus diesem Handbuch auszuführen: http://bottlepy.org/docs/dev/async.htmlBottle + GEVENT Unicode-Codierung Fehler

Den Code, die auf der Website funktioniert nicht. Ich habe versucht, es so minimal wie möglich zu schreiben, aber es hat nichts verändert. Hier ist meine endgültige Version.

Server-Seite:

from bottle import request, Bottle, abort 
app = Bottle() 

@app.route('/websocket') 
def handle_websocket(): 
    return "Hello" 

from gevent.pywsgi import WSGIServer 
from geventwebsocket import WebSocketError 
from geventwebsocket.handler import WebSocketHandler 
server = WSGIServer(("0.0.0.0", 8080), app, 
       handler_class=WebSocketHandler) 
server.serve_forever() 

Client-Seite:

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="UTF-8"> 
    <script type="text/javascript"> 
    var ws = new WebSocket("ws://localhost:8080/websocket"); 
    </script> 
</head> 
</html> 

Der Server druckt die folgenden Fehler Spur. Was läuft falsch?

Traceback (most recent call last): 
File "/usr/lib/python3.5/site-packages/gevent/pywsgi.py", line 884, in handle_one_response 
self.run_application() 
File "/usr/lib/python3.5/site-packages/geventwebsocket/handler.py", line 70, in run_application 
self.result = self.upgrade_websocket() 
File "/usr/lib/python3.5/site-packages/geventwebsocket/handler.py", line 129, in upgrade_websocket 
return self.upgrade_connection() 
File "/usr/lib/python3.5/site-packages/geventwebsocket/handler.py", line 219, in upgrade_connection 
hashlib.sha1(key + self.GUID).digest())), 
TypeError: Unicode-objects must be encoded before hashing 
{'GATEWAY_INTERFACE': 'CGI/1.1', 
'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 
'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5', 
'HTTP_CACHE_CONTROL': 'no-cache', 
'HTTP_CONNECTION': 'keep-alive, Upgrade', 
'HTTP_HOST': 'localhost:8080', 
'HTTP_ORIGIN': 'null', 
'HTTP_PRAGMA': 'no-cache', 
'HTTP_SEC_WEBSOCKET_EXTENSIONS': 'permessage-deflate', 
'HTTP_SEC_WEBSOCKET_KEY': '8p+us6WWOyVrAJ+HOwqYog==', 
'HTTP_SEC_WEBSOCKET_VERSION': '13', 
'HTTP_UPGRADE': 'websocket', 
'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64; rv:40.0) Gecko/20100101 ' 
       'Firefox/40.0', 
'PATH_INFO': '/websocket', 
'QUERY_STRING': '', 
'REMOTE_ADDR': '127.0.0.1', 
'REMOTE_PORT': '59781', 
'REQUEST_METHOD': 'GET', 
'SCRIPT_NAME': '', 
'SERVER_NAME': 'localhost.localdomain', 
'SERVER_PORT': '8080', 
'SERVER_PROTOCOL': 'HTTP/1.1', 
'SERVER_SOFTWARE': 'gevent/1.1 Python/3.5', 
'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>, 
'wsgi.input': <gevent.pywsgi.Input object at 0x7f0f9194e1c8>, 
'wsgi.multiprocess': False, 
'wsgi.multithread': False, 
'wsgi.run_once': False, 
'wsgi.url_scheme': 'http', 
'wsgi.version': (1, 0), 
'wsgi.websocket': <geventwebsocket.websocket.WebSocket object at 0x7f0f9194f250>, 
'wsgi.websocket_version': '13'} failed with TypeError 
Traceback (most recent call last): 
File "/usr/lib/python3.5/site-packages/gevent/greenlet.py", line 534, in run 
    result = self._run(*self.args, **self.kwargs) 
File "/usr/lib/python3.5/site-packages/gevent/baseserver.py", line 25, in _handle_and_close_when_done 
return handle(*args_tuple) 
    File "/usr/lib/python3.5/site-packages/gevent/pywsgi.py", line 1253, in handle 
handler.handle() 
    File "/usr/lib/python3.5/site-packages/gevent/pywsgi.py", line 443, in handle 
result = self.handle_one_request() 
    File "/usr/lib/python3.5/site-packages/gevent/pywsgi.py", line 658, in handle_one_request 
self.handle_one_response() 
    File "/usr/lib/python3.5/site-packages/gevent/pywsgi.py", line 916, in handle_one_response 
self.log_request() 
    File "/usr/lib/python3.5/site-packages/geventwebsocket/handler.py", line 236, in log_request 
if '101' not in self.status: 
TypeError: a bytes-like object is required, not 'str' 
<Greenlet at 0x7f0f91bfa898: _handle_and_close_when_done(<bound method WSGIServer.handle of <WSGIServer at , <bound method StreamServer.do_close of <WSGIServer, (<gevent._socket3.socket [closed] object, fd=-1,)> failed with TypeError 

Antwort

0

Nur eine Vermutung, aber haben Sie versucht:

@app.route('/websocket') 
def handle_websocket(): 
    return b"Hello" 

(Auf einer Seite beachten, wenn Sie über die Leistung kümmern, dann sollten Sie einen Array zurück, keinen String return [b"Hello"].)

+0

Das Problem ist nicht mit OPs app, es mit geventwebsocket ist. –