17.tornado操作之屎一样的代码的整合+详细过程

今天满脑子都是自己在上一篇文中第一部分写的代码,害,自己写的代码,逃是逃不掉的,前面之所以开发两个版本的聊天室,就是因为项目开发到上篇文章所讲那个功能时,发现代码冗余甚是严重,自己都没眼看的那种。
本想通过开发第二个精简版本逃避我那屎一样的代码,结果这强迫症,它就一直在我脑海里让我一遍又一遍的回想我那屎一样的代码。
tmd,受不了受不了,花点时间来给那屎一样的代码整合一下吧~
就基于上文中第一部分那个版本的代码进行整合哦~

我的目标:

  • 和屎一样的代码说拜拜(罢了罢了,认真认真,不能因为自己写的代码乱了feel)
  • 我的目标——抽取出重复的代码,并且完善页面显示。

1.将重复的功能代码放到一个方法里进行调用:

def make_data(handler, msg, name='system',img_url=None):
    """
    生成用来处理发送信息的字典
    :param handler:   RequestHandler 的实例
    :param msg :   发送给用户的信息内容
    :param name:    用户名
    :param img_url:  图片
    :return :   用来给websocket发送的内容
    """
    chat = {
    
    
        'id': str(uuid.uuid4()),
        'body': msg,
        'username':name,
        'img_url':img_url,
    }
    html = tornado.escape.to_basestring(handler.render_string('message.html', chat=chat))
    data = {
    
    
        'html': html,
        'id': chat['id']
    }

    return data

2.在Chatwshandler中调用:

class ChatWsHandler(tornado.websocket.WebSocketHandler,SessionMixin):
    """
    处理和响应 websocket连接
    """
    waiters = set()  # 等待接收信息的用户
    history = []  # 存放历史信息

    def get_current_user(self):
        # 获取session  None
        return self.session.get('tudo_user', None)

    def open(self,*args,**kwargs):
        # 新的websocket 连接打开,自动调用的操作
        print('new ws connection:{}'.format(self))
        # 将用户加到连接中
        ChatWsHandler.waiters.add(self)

    def on_close(self):
        #     新的websocket 连接断开
        print('close ws connection:{}'.format(self))
        # 将用户从连接中关闭
        ChatWsHandler.waiters.remove(self)

    def on_message(self,message):
        # 新的websocket 服务端接收到信息自动调用

        print('got message:{}'.format(message))
        parsed = tornado.escape.json_decode(message)
        # chat = {
    
    
        #     'id': str(uuid.uuid4()),
        #     'body': parsed['body']
        # }
        # 判断用户是否有输入内容和用户是否输入网址以http开头
        # if chat['body'] and chat['body'].startswith('http://'):
        msg_from_user = parsed['body']
        if msg_from_user and msg_from_user.startswith('http://'):
            # 模拟浏览器发送请求获取数据
            client = AsyncHTTPClient()
            # 获取数据
            save_api_url = 'http://192.168.182.144:8002/s?save_url={}&user={}&from=room'.format(
                # chat['body'],
                msg_from_user,
                self.current_user
            )
            print(save_api_url)
            # IOLoop.current().spawn_callback(client.fetch, save_api_url)
            IOLoop.current().spawn_callback(client.fetch, save_api_url,request_timeout=30)
            # 告诉用户发送的url正在处理
            # msg = 'user:{},url {} is processing'.format(self.current_user,chat['body'])
            msg = 'user:{},url {} is processing'.format(self.current_user,msg_from_user)
            # 将正在处理的信息告诉用户,但是呢,不让其他的用户也看到
            # chat['body'] = msg
            # message_html = {
    
    
            #     'html': tornado.escape.to_basestring(
            #         self.render_string('message.html', chat=chat)
            #     ),
            #     'id': chat['id']
            #
            # }
            message_html = make_data(self,msg)
            self.write_message(message_html)

        else:
            # message_html = {
    
    
            #     'html': tornado.escape.to_basestring(
            #         self.render_string('message.html', chat=chat)
            #     ),
            #     'id': chat['id']
            #
            # }
            message_html = make_data(self,msg_from_user,self.current_user)
            ChatWsHandler.history.append(message_html)
            ChatWsHandler.send_updates(message_html)
    @classmethod
    def send_updates(cls,message_html):
        """给每个等待接收的用户发送新信息"""
        for w in ChatWsHandler.waiters:
            w.write_message(message_html)

3.在service.py中调用make_data:

from .chat import ChatWsHandler,make_data
class AsyncSaveHandler(AuthBaseHandler):
    """
    使用异步
    """
    def prepare(self):
        print(self.get_argument('save_url','empty'))

    @tornado.gen.coroutine
    def get(self,*args,**kwargs):
        save_url = self.get_argument('save_url',None)
        username = self.get_argument('user',None)
        is_from_room = self.get_argument('from',None) =='room'
        if username and is_from_room:
            resp = yield self.get_rep(save_url)
            ims = UploadImage(self.settings['static_path'],'x.jpg')
            ims.save_upload(resp.body)
            ims.make_thumb()
            # post = add_post(self.current_user,ims.image_url,ims.thumb_url)
            post = add_post(username,ims.image_url,ims.thumb_url)

            # self.redirect('/post/{}'.format(post.id))
            # 告诉用户你的图片保存完成
            msg='new picture from {}: http://192.168.182.144:8002/post/{}'.format(username, post.id)
            message_html = make_data(self,msg,img_url=ims.thumb_url)
            #
            ChatWsHandler.send_updates(message_html)
            # self.write(post.id)
        else:
            # 如果不符合
            print('wrong call')
            self.write('wrong call')
    #使用延迟的方式
    @tornado.gen .coroutine
    def get_rep(self,url):
        # yield tornado.gen.sleep(5)
        client = AsyncHTTPClient()
        # resp = yield client.fetch(url)
        resp = yield client.fetch(url,request_timeout=30)
        return resp

4. 前端页面修改:

  • message.html文件:
<div class="message" id="m{
     
     { chat['id'] }}"><span class="badge badge-primary">{
   
   { chat['username'] }}</span>:{% module linkify (chat['body']) %}
    {% if chat['img_url'] %}
    <br>
    <img src="{
     
     { static_url(chat['img_url']) }}"/>
    {% end %}
</div>
  • 实现效果,其实根据上面这个前端页面很直接就能看出来,大家可以自己一步步操作出效果看看哦~

猜你喜欢

转载自blog.csdn.net/qq_44907926/article/details/125125437