使用  Bootstrap 前端框架

可以在 bootCDN 这里找 jquery ,poppe.js 文件

当聊天室发来一第图片链接时,自动保存图片到服务器,并保存相关信息到数据库,系统向该用户发出扑救 信息

class ChatWebsocket(tornado.websocket.WebSocketHandler, AuthBaseHandler):
"""处理 Websocket 连接"""
walters = set() # 去除网络中重复的请求
history = [] # 存放历史信息
history_size = 10 # 消息列表的大小 def open(self):
# print('websocket opened')
ChatWebsocket.walters.add(self) def on_message(self, message):
p = tornado.escape.json_decode( message ) # 解码成为字典
body = p['body']
if body and ( body.startswith('http://') or body.startswith('https://') ):
client = AsyncHTTPClient()
save_api_url = 'http://47.107.171.155:8000/sa?save_url={}&name={}'.format( body, self.current_user )
IOLoop.current().spawn_callback( client.fetch, save_api_url ) # 不会等待结果
chat = ChatWebsocket.make_chat(
body='图片链接{}正在下载。'.format( body )
)
html = self.render_string('message.html', message = chat) # 渲染 message.html 页面
msg = {
'html':tornado.escape.to_basestring( html ),
'id':chat['id']
}
self.write_message( msg )
else:
chat = ChatWebsocket.make_chat(
p['body'],
self.current_user
)
html = self.render_string('message.html', message = chat) # 渲染 message.html 页面
msg = {
'html':tornado.escape.to_basestring( html ),
'id':chat['id']
}
ChatWebsocket.update_history( msg )
ChatWebsocket.send_update( msg ) @classmethod
def make_chat(cls, body, name='系统信息', img_url='' ):
chat = {
'id' : str(uuid.uuid4()),
'body': body,
'name': name,
'img_url': img_url
}
return chat @classmethod
def update_history(cls, msg):
"""更新消息列表"""
ChatWebsocket.history.append(msg)
if len(ChatWebsocket.history) > ChatWebsocket.history_size:
ChatWebsocket.history = ChatWebsocket.history[ChatWebsocket.history_size:] @classmethod
def send_update(cls, msg):
"""发送信息给所有用户"""
for w in ChatWebsocket.walters:
w.write_message(msg) def on_close(self):
ChatWebsocket.walters.remove(self)

当图片保存成功后,系统要向聊天室的所有人发信息提示,

class AyncSaveHandler(AuthBaseHandler):
"""异步版本保存 URL"""
@coroutine
def get(self, *args, **kwargs):
save_url = self.get_argument('save_url', None)
name = self.get_argument('name', '')
client = AsyncHTTPClient() # res = requests.get(save_url)
res = yield client.fetch(save_url, request_timeout=20)
uim = UploadImg('a.jpg', self.settings['static_path'])
uim.save_upload(res.body)
uim.save_thumb() # post = add_post_for(self.current_user, uim.upload_url, uim.thumb_url)
post = add_post_for(name, uim.upload_url, uim.thumb_url)
chat = ChatWebsocket.make_chat(
'用户 ' + name + '{}http://47.107.171.155:8000/post/{}'.format('上传了图片', post.id ),
img_url=uim.thumb_url
)
html = self.render_string( 'message.html', message=chat ) # 渲染 message.html 页面
msg = {
'html': tornado.escape.to_basestring( html ),
'id': chat['id']
} ChatWebsocket.send_update( msg )

潭州课堂25班:Ph201805201 tornado 项目 第十一课 项目改进和优化(课堂笔记)的更多相关文章

  1. 潭州课堂25班:Ph201805201 tornado 项目 第七课 界面美化和静态文件处理(课堂笔记)

    tornado 相关说明 使用  Bootstrap 前端框架 可以在 bootCDN 这里找 jquery ,poppe.js 文件 美化项目 twittel 的开源项目, 在 static 目录下 ...

  2. 潭州课堂25班:Ph201805201 django 项目 第三课 码云注册,django项目 (课堂笔记)

    d码云注册,登录, 创建项目: 生成秘钥 想看秘钥: 添加公钥 复制 ssh 连接 通过  git clone <ssh> 连接 在服务器上创建 python3 虚拟环境, 创建项目  p ...

  3. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第四课 登录注册 (课堂笔记)

    index.html 首页 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  4. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第三课 (课堂笔记)

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  5. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第二课 (课堂笔记)

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  6. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第一课 (课堂笔记)

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  7. 潭州课堂25班:Ph201805201 第十课 类的定义,属性和方法 (课堂笔记)

    类的定义 共同属性,特征,方法者,可分为一类,并以名命之 class Abc: # class 定义类, 后面接类名 ( 规则 首字母大写 ) cls_name = '这个类的名字是Abc' # 在类 ...

  8. 潭州课堂25班:Ph201805201 django框架 第九课 模型补充 博客小案例 (课堂笔记)

    聚合查询: 分组查询: annotate() 方法 例:查询某学院学生人数,(一对多查询) 以字典的形式输出 annotate(统计 ‘关联学生字段 出现的次,).字典形式(键,值) 例:查询每项课程 ...

  9. 潭州课堂25班:Ph201805201 tornado 项目 第十二课 项目部署(课堂笔记)

    运行多个Tornado实例 网页响应不是特别的计算密集型处理 多个实例充分利用 CPU 多端口怎么处理 Linux 常见应用服务配置模式 nginx 和 supervisord:采用主配置文件 + 项 ...

随机推荐

  1. 前端神器之jquery

    jquery介绍 jQuery是目前使用最广泛的javascript函数库.据统计,全世界排名前100万的网站,有46%使用jQuery,远远超过其他库.微软公司甚至把jQuery作为他们的官方库. ...

  2. 分布式监控系统开发【day38】:监控trigger表结构设计(一)

    一.需求讨论 1.zabbix触发器的模板截图 1.zabbix2.4.7 2.zabbix3.0 2.模板与触发器关联的好处 好处就是可以批量处理,比如我说我有1000机器都要监控cpu.内存.IO ...

  3. SpringCloud笔记四:Ribbon

    目录 什么是Ribbon? Ribbon的配置 Maven引入 开启注解 Ribbon负载均衡 新建provider8002和8003 Ribbon核心组件IRule Ribbon自定义 什么是Rib ...

  4. 阿里云ECS服务器Ubuntu安装MySQL并远程访问

    root账户登录服务器Ubuntu16.04 apt-get update apt-get install mysql-server mysql-client; 安装时会让你设置root密码,输入2次 ...

  5. 解决 IIS 反向代理ARR URLREWRITE 设置后,不能跨域跳转 return Redirect 问题

    1.选择iis根节点,点击ARR 2.选择代理设置 3.去掉reverse rewrite host in response headers的勾选,点击应用即可

  6. SpringBoot系列: JdbcTemplate 事务控制

    ============================Spring JdbcTemplate 事务控制============================之前使用 JDBC API 操作, 经常 ...

  7. LaTeX技巧561:LaTeX如何让每一章带有目录?

    转自: http://blog.sina.com.cn/s/blog_5e16f1770102ds8b.html LaTeX技巧561:LaTeX如何让每一章带有目录? [问题描述] 当前章节列出该章 ...

  8. [物理学与PDEs]第4章第3节 一维反应流体力学方程组 3.3 一维反应流体力学方程组的数学结构

    一维理想反应流体力学方程组是一阶拟线性双曲组.

  9. Scrapy框架-----爬虫

    说明:文章是本人读了崔庆才的Python3---网络爬虫开发实战,做的简单整理,希望能帮助正在学习的小伙伴~~ 1. 准备工作: 安装Scrapy框架.MongoDB和PyMongo库,如果没有安装, ...

  10. websocket 与Socket.IO介绍

    一  websocket WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如 Chrome,Safrie,Firefox,Opera,IE等等,对该协议支持最早的 ...