2017-12-18 18 views
1

긴 (ish) 실행 작업에 대한 사용자 요청을 처리하고 작업 진행에 따라 사용자를 업데이트하며 클라이언트에 대한 일부 데이터를 반환하는 서버를 구축하려고합니다. 사용. 나는 이것을하기 위해 토네이도의 WebSocketHandler를 사용하려고 시도하고있다. 다른 객체에서 WebSocketHandler의 write_message 메소드를 호출 할 수없는 이유가 있습니까?AttributeError : 'WebSocketHandler'객체에 'write_messsage'속성이 없습니다.

import tornado.ioloop 
import tornado.websocket 
import json, sys, os 
from uuid import uuid4 


class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
     self.write('Welcome to the site. Requests cannot be made to the main page.') 



class WSInvalidRequest(Exception): 
    """Called when user sends invalid request to the server.""" 
    pass 



class WSRequestQueue: 
    def __init__(self): 
     self._items = [] 

    def put(self, item): 
     self._items.append(item) 
     return self._items.length() 

    def get(self): 
     return self._items.pop(0) 

    def get_position(self, item): 
     return self._items.index(item) 


QUEUE = WSRequestQueue() 


class WSRequest: 

    def __init__(self, message, websocket): 
     self.websocket = websocket 
     self.ran = False 
     self.valid = False 
     self.write(u'Request received.') 
     try: 
      self.request = WSRequest.parse_message(message) 
      self.valid = True 
      self.write(u'Request validated.') 
      position = QUEUE.put(self) 
      self.write(u'Added request to queue behind %i other requests.' % position) 

     except WSInvalidRequest as e: self.write(e.message) 


    @staticmethod 
    def validate_request_dict(request): 
     if not isinstance(messageDict, dict): 
      raise WSInvalidRequest(u'Invalid request. Should be JSON dict string.') 

     if 'arg' not in request: 
      raise WSInvalidRequest(u'Invalid request. No arg found') 


    @staticmethod 
    def parse_message(message): 
     messageDict = json.loads(message) 
     validate_request_dict(messageDict) 
     argument = messsageDict['arg'] 
     return {'argumet': argument} 


    def write(self, message): 
     self.websocket.write_messsage(unicode(message)) 


    def run(self): 
     self.ran = True 


    def destroy(self): 
     if self.valid: 
      if not self.ran: QUEUE.pop(QUEUE.get_position(self)) 
      self.websocket.requests.remove(self) 

     self.write(u'Removed request from queue.') 



class RequestWebSocket(tornado.websocket.WebSocketHandler): 

    def open(self): 
     self.id = uuid4() 
     self.requests = set() 
     print("WebSocket opened") 


    def on_message(self, message): 
     self.write_message(u'You sent: %s' % message) 
     self.write_message(u'Attempting to add your request to the queue.') 
     newRequest = WSRequest(message, self) 
     if newRequest.valid: self.requests.add(newRequest) 
     else: newRequest.destroy 


    def on_close(self): 
     print("WebSocket closed. Removing all requests from the queue.") 
     for request in self.requests: request.destroy() 


    def check_origin(self, origin): 
     return True 




if __name__ == "__main__": 

    # Create the web server 
    application = tornado.web.Application([ 
     (r'/', MainHandler), 
     (r'/websocket', RequestWebSocket) 
    ], debug=True) 

    application.listen(80) 
    tornado.ioloop.IOLoop.instance().start() 
+0

,하지만 난 다른 곳과 통화에서 메시지를 받아 내 WebSocketHandler에 사용자 정의 메소드를 추가하는 것이 었습니다 해결 방법을 발견했다 :

에서 그것은이다 self.write_message. – austinmilt

답변

2

write_messsage에 맞춤법 오류가 있습니다. 추가 s이 있습니다. 내가 다른 개체로부터 액세스 write_message 캔트 이유를 잘 모릅니다

class WSRequest: 

    def write(self, message): 
     self.websocket.write_messsage(unicode(message)) 
           #^extra 's' 
+0

와우, 나는 바보 야. 감사! – austinmilt