前言
  websocket 是一种html5新的接口,以前服务器推送需要进行ajax等方式进行轮训,对服务器压力较高,随着新标准的推进,使用websocket在推送等方面已经是比较成熟了,并且各个浏览器对websocket的支持情况已经比较好了,只要不是太老古古董,对这些暂时不考虑。
  使用websocket的时候,前端使用是比较规范的,js支持ws协议,感觉上类似于一个轻度封装的socket协议,只是以前需要自己维护socket的连接,现在能够以比较标准的方法来进行。
  总的来说因为前端是js,所以后端对websocket支持最好的是socket.io,在搜索websocket相关的内容的时候感觉socket.io对这个的推广也是不少的,但是现在使用的是python,因为新学习python
  事件不长,各个框架都在接触一点还是有好处了。
  常用框架:
  uwsgi
  flask
  tornado
  django
  下面几个都是一个回音壁程序,也就是接受前端js发过来的websocket信息,然后将websocket再原路返回
  前端js:
  var s = new WebSocket("%s://%s/foobar/");
  s.onopen = function() {}
  s.onmessage = function(e) {}
  s.onerror = function(e) {}
  s.onclose = function(e) {}
  s.send(value);
  这几条就是常用的js使用websocket的代码,处理逻辑没有写,要看完整的看下面uwsgi的官方给的例子,我基本上是照搬的。连接回掉,获取信息回掉,错误回掉,关闭回掉,以及发送信息
  uwsgi
  官方文档已经很好了,第一个成功执行的websocket程序就是uwsgi,然后才慢慢的前端不变,然后后端找其他的方案,官方给的例子也是简单易懂的,例子在websockets_chat_async.py,从这个例子来看,只用uwsgi,需要维护太多的内容,html与python混在一起实在不太好看,所幸这个例子足够简单。
  flask-uwsgi-websocket
  from flask import Flask, request, render_template
  from flask.ext.uwsgi_websocket import GeventWebSocket
  app = Flask(__name__)
  ws = GeventWebSocket(app)
  @app.route('/')
  def index():
      return render_template('index.html')
  @ws.route('/foobar')
  def echo(wscon):
      msg = wscon.receive()
      if msg is not None:
          wssss.send(msg)
  if __name__ == '__main__':
      app.run(gevent=100)
  这里使用flask自带python容器进行执行python web
  从上面代码可以看到,使用很简单,其余部分跟普通的flask都没有区别,只需要在需要更改websocket的url请求修饰符,修饰符的来源是:
  1   ws = GeventWebSocket(app)
  很简单也很强大,前端库因为逻辑不需要更改,所以感觉挺好的,但是这个库Flask-uWSGI-WebSocket好像有个bug,在用这个库的时候,前端js持续接收到空的消息然后触发了onmessage回掉函数,在使用同样的前端js,其他后端库的时候没有这个问题。
  geventwebsocket
  from flask import Flask, request, render_template, abort
  from geventwebsocket.handler import WebSocketHandler
  from gevent.pywsgi import WSGIServer
  app = Flask(__name__)
  @app.route('/')
  def index():
      return render_template('index.html')
  @app.route('/foobar')
  def echo():
      if request.environ.get('wsgi.websocket'):
          ws = request.environ['wsgi.websocket']
          if ws is None:
              abort(404)
          else:
              while True:
                  if not  ws.closed:
                      message = ws.receive()
                      ws.send(message)
  if __name__ == '__main__':
      http_server = WSGIServer(('',5000), app, handler_class=WebSocketHandler)
      http_server.serve_forever()
  这段代码同样使用了flask来进行模板,url之类的解析,不同之处是不再使用flask自带的容器,而是当作一个应用,被gevent里的一个uwsgiserver容器来调用。
  而与普通使用方法不同的是注入了handler_class这个类,替换成websocket类型的,具体实现还没有看,但是从逻辑上可以理解,原来的wsgiserver不理解websocket,所以换一个理解websocket的类来进行处理,
  所以在foobar的程序中才可以从request的环境变量里获取websocket连接,从这里来看,websockethandler也对websocket连接进行了维护工作,简化了很多工作。
  需要注意的是,这个库当前最新版本是0.9.5,网上搜到了一个教程,但是它的版本针对的是0.3.5版本的,这个库的维护者还进行了变更,其中有些api好像有了变化,需要注意。

request.environ.get('wsgi.websocket')的更多相关文章

  1. 获取用户的相关请求信息, 以及包括请求头 request.environ

    #在index文件中 1. print(type(request)) #看出所属库 2. from django.core.handlers.wsgi import WSGIRequest #查看WS ...

  2. WebSocket with Flask

    转自:https://blog.shonenada.com/post/websocket-with-flask/ WebSocket with Flask HTML5 以前,HTML 还不支持 Web ...

  3. IronFort---基于Django和Websocket的堡垒机

    WebSSH有很多,基于Django的Web服务也有很多,使用Paramiko在Python中进行SSH访问的就更多了.但是通过gevent将三者结合起来,实现通过浏览器访问的堡垒机就很少见了.本文将 ...

  4. WebSocket群聊与单聊

    一 . WebSocket实现群聊 py文件代码 # py文件 from flask import Flask, render_template, request from geventwebsock ...

  5. python全栈开发day115、116-websocket、websocket原理、websocket加解密、简单问答机器人实现

    1.websocket 1.websocket 与轮询 轮询: 不断向服务器发起询问,服务器还不断的回复 浪费带宽,浪费前后端资源 保证数据的实时性 长轮询: 1.客户端向服务器发起消息,服务端轮询, ...

  6. 简单使用WebSocket实现聊天室

    环境需求:flask,websocket第三方包 目录结构 web中实现群聊 ws_群聊.py文件 # 实现一个websocket 先下载包 gevent-websocket from flask i ...

  7. websocket 实现单聊群聊 以及 握手原理+加密方式

    WebSocket 开始代码 服务端 群聊 # type:WebSocket 给变量标注类型 # websocket web + socket from geventwebsocket.server ...

  8. 轮询、长轮询和websocket

    一.轮询 在一些需要进行实时查询的场景下应用比如投票系统: 大家一起在一个页面上投票 在不刷新页面的情况下,实时查看投票结果 1.后端代码 from flask import Flask, rende ...

  9. Flask websocket

    websocket 概念 是一套协议,协议规定了: - 连接时需要握手 - 发送数据进行加密 - 连接之后不断开 意义 实现长轮询等操作 框架支持 - flask,gevent-websocket - ...

随机推荐

  1. dup,dup2函数【转】

    转自:http://eriol.iteye.com/blog/1180624 转自:http://www.cnblogs.com/jht/archive/2006/04/04/366086.html ...

  2. ES系列目录

    ES系列一.CentOS7安装ES 6.3.1 ES系列二.CentOS7安装ES head6.3.1 ES系列三.基本知识准备 ES系列四.ES6.3常用api之文档类api ES系列五.ES6.3 ...

  3. 故障 -> nginx启动失败

    描述:在用saltstack给 minion 安装 nginx 服务 时 提示 nginx 服务下载成功,但是启动失败. ---------- ID: nginx-systemctl Function ...

  4. 16-client、offset、scroll系列

    1.client系列 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...

  5. appium运行报错java.net.SocketException: socket write error

    这个错我调了 快两天一点头绪没有,脚本正常跑没问题,但是就是控制台输出信息报错,没法定位问题在哪.报错如图: 虽然这个报错不影响测试结果,但是本人有强迫症,一定要查出究竟: 我的尝试: 1.那天试验, ...

  6. GitHub上优秀的Go开源项目

    近一年来,学习和研究Go语言,断断续续的收集了一些比较优秀的开源项目,这些项目都非常不错,可以供我们学习和研究Go用,从中可以学到很多关于Go的使用.技巧以及相关工具和方法.我把他们整理发出来,大家有 ...

  7. 使用 HTTP/2 提升性能的几个建议

    历史悠久的超文本传输协议,即HTTP标准,最近版本升级了.HTTP/2在2015年5月被批准,目前已经在很多Web浏览器和服务器中得到实现(包括NGINX Plus和开源NGINX).大约有三分之二的 ...

  8. jQuery版本的jsonp

    1.一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面.动态网页.web服务.WCF,只要是跨域请求,一律不准: 2.不过我们又发现,Web页面上调用js文件时则不 ...

  9. SSD笔记

    参考:https://zhuanlan.zhihu.com/p/24954433?refer=xiaoleimlnote http://blog.csdn.net/u010167269/article ...

  10. java util Aarrys 类

    toString方法  产生一维数组的二维版本 public static String toString(type[] a) { //type 是传入数据类型 if (a == null) retu ...