使用  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. 打怪升级之路—Security+认证通关攻略(401还是501)

    我花了一个月才把题目过完一遍的(这一个月都上班,下班抽空做几页),这里面走了很多弯路,我把备考过程整理出来希望对大家有帮助. 我是在2019年1月完成的Security+考试,离安全牛课堂直播培训结束 ...

  2. 10分钟快速搞定pandas

    本文是对pandas官方网站上<10 Minutes to pandas>的一个简单的翻译,原文在这里.这篇文章是对pandas的一个简单的介绍,详细的介绍请参考:Cookbook .习惯 ...

  3. Spark Standalone spark-env.sh

    export JAVA_HOME=/app/jdk export SPARK_MASTER_PORT=7077 export SPARK_MASTER_WEBUI_PORT=8080 export S ...

  4. 为什么wait()方法要放在同步块

    回顾一下,如果wait()方法不在同步块中,代码的确会抛出异常: public class WaitInSyncBlockTest { @Test public void test() { try { ...

  5. 【原创】支持同时生成多个main函数 makefile 模板

    背景: 去年做项目的时候,由于有需要编译出多个可执行文件的需求,修改了Makefile使其支持生成多个结果(编译多个含有main函数的文件),但总觉得自己的实现不够完美. 今年又遇到这样需求的时候,可 ...

  6. 深入浅出mybatis之启动详解

    深入浅出mybatis之启动详解 MyBatis功能丰富,但使用起来非常简单明了,今天我们来追踪一下它的启动过程. 目录 如何启动MyBatis 如何使用MyBatis MyBatis启动过程 如何启 ...

  7. 利用git提交代码

    一.首先需要下载git 查看电脑是否安装git,打开终端,输入git,回车如果输出如下,则代表已安装了git 如果未安装,则会输出: 按照提示输入:sudo apt-get install git即可 ...

  8. About the Importance of Aim in Life

    Have an aim in life, or your energies will all be wasted.   ---R. Peters 人生应该树立目标,否则你的精力会白白浪费. ---彼得 ...

  9. js中的简单数据类型和复杂数据类型的存储

    基本类型存储的是值而复杂数据类型也叫引用类型存储的是对象的地址如0x00001而在栈中存的是变量数值和函数参数 堆中存的是对象和数组 堆栈空间分配 栈(操作系统):由操作系统自动分配释放 ,存放函数的 ...

  10. Codeblock代码提示自动补全(包括结构体成员)

    转:https://blog.csdn.net/haibin8473/article/details/79113650