request.environ.get('wsgi.websocket')

WebSocket与Python框架
本文探讨了WebSocket在HTML5中的应用,以及如何通过Python的多种框架如uwsgi、flask、tornado和django实现WebSocket的前后端交互。文章对比了不同框架下WebSocket的实现方式,包括直接使用uwsgi、结合flask的flask-uwsgi-websocket和geventwebsocket。

 

 

  前言
  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好像有了变化,需要注意。

转载于:https://www.cnblogs.com/qunxiadexiaoxiangjiao/p/9687794.html

### Python 中 `os.environ.get('HOME')` 的用法与返回值 在 Python 中,`os.environ` 是一个类似于字典的对象,提供了对系统环境变量的访问接口[^1]。通过调用 `os.environ.get('HOME')`,可以获取名为 `'HOME'` 的系统环境变量对应的值。 #### 用法说明 `os.environ.get(key)` 是一种安全的方式从环境中检索指定名称的变量值。如果该变量不存在,则返回 `None` 或者用户提供的默认值。语法如下: ```python value = os.environ.get('KEY', default=None) ``` 其中: - `key`: 要查询的环境变量名。 - `default`: 可选参数,当环境变量不存在时返回此默认值。 对于 `'HOME'` 来说,它是许多操作系统中常见的环境变量之一,通常表示用户的主目录路径[^1]。 #### 返回值解释 执行 `os.environ.get('HOME')` 后的结果取决于操作系统的配置以及是否设置了相应的环境变量: - 在 Unix/Linux/MacOS 平台上,大多数情况下会返回当前登录用户的家目录绝对路径,比如 `/home/username` 或 `/Users/username`. - Windows 上则不一定有显式的 `'HOME'` 定义;即使存在也可能指向不同的位置(例如某些发行版安装后的自定义设定)。因此,在跨平台开发时需注意这一点,并考虑使用更通用的方法来定位用户资料夹[^2]。 另外值得注意的是,任何经由 `os.environ` 修改过的环境设置只会在同一 Python 进程及其子进程中生效,外部不受影响[^2]。 #### 示例代码 下面给出一段简单演示如何运用 `os.environ.get()` 获取 HOME 目录的例子: ```python import os # 尝试取得 HOME 环境变量 home_dir = os.environ.get('HOME') if home_dir: print(f"The user's home directory is located at: {home_dir}.") else: print("'HOME' environment variable not found.") # 设定一个新的临时环境变量 TEST_VAR os.environ['TEST_VAR'] = "This is a test" test_var_content = os.environ.get('TEST_VAR') print(f"Content of newly created env var 'TEST_VAR': {test_var_content}") # 清除刚才创建的那个测试变量 del os.environ['TEST_VAR'] after_deletion_test_var = os.environ.get('TEST_VAR') print(f"After deletion, content of 'TEST_VAR': {after_deletion_test_var}") ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值