潭州课堂25班:Ph201805201 tornado 项目 第十一课 项目改进和优化(课堂笔记)
可以在 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 项目 第十一课 项目改进和优化(课堂笔记)的更多相关文章
- 潭州课堂25班:Ph201805201 tornado 项目 第七课 界面美化和静态文件处理(课堂笔记)
tornado 相关说明 使用 Bootstrap 前端框架 可以在 bootCDN 这里找 jquery ,poppe.js 文件 美化项目 twittel 的开源项目, 在 static 目录下 ...
- 潭州课堂25班:Ph201805201 django 项目 第三课 码云注册,django项目 (课堂笔记)
d码云注册,登录, 创建项目: 生成秘钥 想看秘钥: 添加公钥 复制 ssh 连接 通过 git clone <ssh> 连接 在服务器上创建 python3 虚拟环境, 创建项目 p ...
- 潭州课堂25班:Ph201805201 WEB 之 页面编写 第四课 登录注册 (课堂笔记)
index.html 首页 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- 潭州课堂25班:Ph201805201 WEB 之 页面编写 第三课 (课堂笔记)
index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- 潭州课堂25班:Ph201805201 WEB 之 页面编写 第二课 (课堂笔记)
index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- 潭州课堂25班:Ph201805201 WEB 之 页面编写 第一课 (课堂笔记)
index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- 潭州课堂25班:Ph201805201 第十课 类的定义,属性和方法 (课堂笔记)
类的定义 共同属性,特征,方法者,可分为一类,并以名命之 class Abc: # class 定义类, 后面接类名 ( 规则 首字母大写 ) cls_name = '这个类的名字是Abc' # 在类 ...
- 潭州课堂25班:Ph201805201 django框架 第九课 模型补充 博客小案例 (课堂笔记)
聚合查询: 分组查询: annotate() 方法 例:查询某学院学生人数,(一对多查询) 以字典的形式输出 annotate(统计 ‘关联学生字段 出现的次,).字典形式(键,值) 例:查询每项课程 ...
- 潭州课堂25班:Ph201805201 tornado 项目 第十二课 项目部署(课堂笔记)
运行多个Tornado实例 网页响应不是特别的计算密集型处理 多个实例充分利用 CPU 多端口怎么处理 Linux 常见应用服务配置模式 nginx 和 supervisord:采用主配置文件 + 项 ...
随机推荐
- RabbitMQ队列的使用
为什么要用RabbitMQ 以常见的订单系统为例,用户点击[下单]按钮之后的业务逻辑可能包括:扣减库存.生成相应单据.发红包.发短信通知.在业务发展初期这些逻辑可能放在一起同步执行,随着业务的发展订单 ...
- django系列 2 :启动应用,目录结构解读
来源:https://docs.djangoproject.com/en/2.1/intro/tutorial01/ 该教程是创建一个用于投票的网页. 1.使用命令创建site 进入要创建site的目 ...
- Vue(小案例_vue+axios仿手机app)_购物车
一.前言 1.购物车 二.主要内容 1.效果演示如下,当我们选择商品数量改变的时候,也要让购物车里面的数据改变 2.具体实现 (1)小球从上面跳到下面的效果 (2)当点击上面的“加入购物车按钮”让小球 ...
- 第十节: 利用SQLServer实现Quartz的持久化和双机热备的集群模式 :
背景: 默认情况下,Quartz.Net作业是持久化在内存中的,即 quartz.jobStore.type = "Quartz.Simpl.RAMJobStore, Quartz" ...
- 基于Windows,Python,Theano的深度学习框架Keras的配置
1.安装Anaconda 面向科学计算的Python IDE--Anaconda 2.打开Anaconda Prompt 3.安装gcc环境 (1)conda update conda (2)cond ...
- MySQL学习5 - 数据类型二.md
一 字符类型 二 枚举类型和集合类型 一 字符类型 #官网:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括号内的 ...
- nnet3bin/nnet3-xvector-compute.cc
将特征在xvector神经网络模型中前向传播,并写出输出向量.我们将说话人识别的特定神经网络结构的输出向量或embedding称之为"Xvector".该网络结构包括:帧级别的多个 ...
- (三)微信小程序首页的分类功能和搜索功能的实现笔记
就在昨天,微信宣布了微信小程序开发者工具新增“云开发”功能 下载最新的开发者工具,现在无需服务器即可实现小程序的快速迭代! 分类功能和搜索功能的效果图 1.首页分类功能的实现 boxtwo方法(.js ...
- iTOP-开发板-MiniLinux-C程序调用shell命令
本文档介绍的是在 linux 系统环境下 linux-C 调用 shell 命令实验步骤,和文档压缩包一起的“iTOP-开发板-MiniLinux-SHELL_V1.0.zip”是 c 程序源码.Li ...
- es2015 解构赋值
解构赋值语法是一个 Javascript 表达式,这使得可以将值从数组或属性从对象提取到不同的变量中.