今天满脑子都是自己在上一篇文中第一部分写的代码,害,自己写的代码,逃是逃不掉的,前面之所以开发两个版本的聊天室,就是因为项目开发到上篇文章所讲那个功能时,发现代码冗余甚是严重,自己都没眼看的那种。
本想通过开发第二个精简版本逃避我那屎一样的代码,结果这强迫症,它就一直在我脑海里让我一遍又一遍的回想我那屎一样的代码。
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>
- 实现效果,其实根据上面这个前端页面很直接就能看出来,大家可以自己一步步操作出效果看看哦~