使用  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. python list的使用

    list列表的常用方法有: #!/usr/bin/env python # -*- coding:utf- -*- #以下方法全在python2..x版本运行,请3.x以上的小伙伴们在print(放入 ...

  2. Ajax与JSON共同使用的小实例

    实现的效果: 点击“点击”按钮,可以通过Ajax从服务器调过来相应的文档文件,而不需重新加载页面. 通过json可以将调过来的文档(String)转换为相应的json对象,从而对文档中数据进行操作. ...

  3. [再寄小读者之数学篇](2014-05-27 矩阵的迹与 Jacobian)

    (from MathFlow) 设 $A=(a_{ij})$, 且定义 $$\bex \n_A f(A)=\sex{\cfrac{\p f}{\p a_{ij}}}. \eex$$ 试证: (1) $ ...

  4. Scrapy 入门

    Scrapy https://docs.scrapy.org/en/latest/intro/overview.html Scrapy is an application framework for ...

  5. dubbo服务运行的三种方式

    dubbo服务运行,也就是让生产服务的进程一直启动.如果生产者进程挂掉,也就不存在生产者,消费者不能进行消费. Dubbo服务运行的三种方式如下:1.使用Servlet容器运行(Tomcat.Jett ...

  6. C++设计模式——解释器模式

    解释器模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对解释器模式是这样说的:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子.如 ...

  7. Mysql -- 数据类型(2)

    掌握char类型和varchar类型 掌握枚举类型和集合类型 字符类型 #官网:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和v ...

  8. Flow Problem

    Flow Problem TimeLimit:5000MS  MemoryLimit:32768KB 64-bit integer IO format:%I64d   Problem Descript ...

  9. SSH总结

    远程服务介绍说明 SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输.确保了数据传输安全.那SSH服务主要功能有哪些呢?1.提供远程连接服务器的服务2.对传输的数据进 ...

  10. oracle查看执行最慢与查询次数最多的sql语句

    前言 在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻辑上做出优化处理,要么是业务特殊性所导致.如果执行频 ...