2017-12-18 2 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

私は別のオブジェクトからのアクセスwrite_messageを傾ける理由を知らないが、私は他の場所との通話からのメッセージを受け入れ、私のWebSocketHandlerにカスタムメソッドを追加した回避策を見つけましたself.write_message。 – austinmilt

答えて

2

write_messsageにスペルミスがあります。余分なのはsです。

ATの:

class WSRequest: 

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

うわー、私はばかです。ありがとう! – austinmilt

関連する問題