python - example - tornado 403 GET advertencia al abrir websocket
tornado websocket example (2)
Solución levemente modificada de @ maxhawkdown.
from tornado.util import PY3
if PY3:
from urllib.parse import urlparse # py2
xrange = range
else:
from urlparse import urlparse # py3
class ChatHandler(tornado.websocket.WebSocketHandler):
CORS_ORIGINS = [''localhost'']
def check_origin(self, origin):
parsed_origin = urlparse(origin)
# parsed_origin.netloc.lower() gives localhost:3333
return parsed_origin.hostname in self.CORS_ORIGINS
Encontré este script python que debería permitirme abrir un WebSocket. Sin embargo, recibo la advertencia [W 1402720 14:44:35 web:1811] 403 GET / (192.168.0.102) 11.02 ms
en mi terminal Linux cuando intento abrir el WebSocket real (usando el complemento Old WebSocket Terminal Chrome). Los mensajes "conexión abierta", "conexión cerrada" y "mensaje recibido" nunca se imprimen en la ventana del terminal.
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.websocket
class MyHandler(tornado.websocket.WebSocketHandler):
def open(self):
print "connection opened"
self.write_message("connection opened")
def on_close(self):
print "connection closed"
def on_message(self,message):
print "Message received: {}".format(message)
self.write_message("message received")
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/",MyHandler)])
server = tornado.httpserver.HTTPServer(app)
server.listen(8888)
tornado.ioloop.IOLoop.instance().start()
por favor añadir
def check_origin(self, origin):
return True
en la clase MyHandler como este
class MyHandler(tornado.websocket.WebSocketHandler):
def check_origin(self, origin):
return True
def open(self):
print "connection opened"
self.write_message("connection opened")
def on_close(self):
print "connection closed"
def on_message(self,message):
print "Message received: {}".format(message)
self.write_message("message received")
De los DOC:
De forma predeterminada, [ check_origin ] rechaza todas las solicitudes con un origen en un host distinto de este.
Esta es una protección de seguridad contra los ataques de secuencias de comandos entre sitios en los navegadores, ya que los WebSockets pueden omitir las políticas habituales de mismo origen y no usan encabezados CORS.
Y otra vez:
Esta es una medida de seguridad importante; no lo deshabilite sin entender las implicaciones de seguridad. En particular, si su autenticación está basada en cookies, debe restringir los orígenes permitidos por check_origin () o implementar su propia protección similar a XSRF para las conexiones de websocket. Vea estos artículos para más.
Link .