标签: gevent-socketio

如何在服务器端发出SocketIO事件

我正在运行gevent-socketio Django应用程序.

我有类似这门课的东西

@namespace('/connect')
class ConnectNamespace(BaseNamespace):

    def on_send(self, data):
        # ...
Run Code Online (Sandbox Code Playgroud)

但是,如果我从javascript客户端收到事件,一切正常,例如send事件处理正确

如果我想要emit服务器端的某些事件,我有点迷失.我可以在课堂上做socket.send_packet

但是现在我想把一些事件链接到post_save信号,所以我想send_packet从这个命名空间类之外,这样做的一种方法是

ConnectNamespaceInstance.on_third_event('someeventname')
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何获取ConnectNamespaceInstance的实例

总结一下,我只想在收到post_save信号后向javascript客户端发送一个事件

python django websocket socket.io gevent-socketio

20
推荐指数
1
解决办法
2330
查看次数

在dotcloud上的gunicorn,nginx(v 1.3.14),django和gevent-socket.io

我试图在dotcloud上在nginx(v 1.3.14)后面部署gunicorn + gevent.我有几个问题.我的目标是改编python-on-dotcloud示例.到目前为止,我还没有能够使用此设置使用websockets部分.换句话说,我必须手动刷新页面以获取更新,而不是通过socket.io.这对我来说都很新鲜,所以它可能是一个总的noob错误.这是一个相关的问题.

以下是我对python-on-dotcloud示例所做的更改.

  1. 显然nginx(从版本1.3.13开始)支持Web套接字.我从python-on-dotcloud示例更新了构建器脚本以指向此开发版本:nginx_download_url="http://nginx.org/download/nginx-1.3.14.tar.gz"

  2. 我设置gunicorn绑定到unix套接字,然后从nginx.conf设置proxy_pass,将流量上行发送到gunicorn proxy_pass http://appserver;,我已经定义了appserver.

  3. 我正在使用gevent-socket.io运行一个django应用程序,在没有运行nginx的情况下工作正常.(我只是将gunicorn绑定到dotcloud.yml中的0.0.0.0:$PORT_WWW)

我的问题是这些.

  1. 我想解决一个没问题吗?

    一个.我已经做了相当多的阅读,建议将枪支放在nginx后面.在dotcloud的前线负载平衡器的背景下,这仍然是真的吗?

    湾 如果我不期望我会受到DoS攻击,那么将gunicorn置于nginx后面仍然很重要吗?

  2. 我试图设置是否可以通过unix套接字运行websockets?

  3. unix套接字是否会在dotcloud上打破缩放?

  4. 如果我需要使用端口,那么如何设置呢?我不认为我可以在同一个应用程序中分配两个http端口.如果我将它拆分为两个应用程序,那么我不确定如何将来自gunicorn应用程序的PORT_WWW环境变量传递到nginx应用程序,以便最终可用于nginx postinstall脚本,从而生成nginx.conf.

  5. 关于为什么这不起作用的任何想法?

我在下面包含了三个配置文件.让我知道其他人是否会有所帮助.谢谢!

dotcloud.yml

www:
    type: custom
    buildscript: python/builder
    systempackages:
        # needed for the Nginx rewrite module
        - libpcre3-dev
        # needed to support python versions 2.7, 3.1, 3.2.
        - python3-all
    ports:
        www: http
    processes:
        nginx: nginx
        app: /home/dotcloud/env/bin/gunicorn -c /home/dotcloud/gunicorn.conf -b unix:/tmp/gunicorn.sock wsgi:application
        #app: /home/dotcloud/env/bin/gunicorn -c /home/dotcloud/gunicorn.conf -b 0.0.0.0:$PORT_WWW wsgi:application
    config:
        # python_version can …
Run Code Online (Sandbox Code Playgroud)

django nginx gunicorn dotcloud gevent-socketio

13
推荐指数
1
解决办法
2347
查看次数

如何制作flask/gevent.socketio服务器的python windows服务?

我有一个flask/gevent SocketIOServer,需要让它作为服务工作:

class TeleportService(win32serviceutil.ServiceFramework):
    _svc_name_ = "TeleportServer"
    _svc_display_name_ = "Teleport Database Backup Service"
    _svc_description_ = "More info at www.elmalabarista.com/teleport"

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED, (self._svc_name_, ''))

        self.ReportServiceStatus(win32service.SERVICE_RUNNING)

        runServer()


@werkzeug.serving.run_with_reloader
def runServer():
    print 'Listening on %s...' % WEB_PORT
    ws = SocketIOServer(('0.0.0.0', WEB_PORT),
        SharedDataMiddleware(app, {}),
        resource="socket.io",
        policy_server=False)

    gevent.spawn(runTaskManager).link_exception(lambda *args: sys.exit("important_greenlet died"))

    ws.serve_forever()
Run Code Online (Sandbox Code Playgroud)

但是,我无法想象如何从SvcStop停止它,并且运行它有一个奇怪的行为,即命令行参数的服务解析在runserver被杀死之后发生.这意味着烧瓶服务器运行,我可以从Web浏览器访问,但服务管理器将其列为"未启动".例如,在命令行中运行:

C:\Proyectos\TeleportServer>python service.py uninstall <--BAD PARAM, TO MAKE IT OBVIOUS
2013-02-13 16:19:30,786 - DEBUG: Connecting to …
Run Code Online (Sandbox Code Playgroud)

python windows windows-services flask gevent-socketio

9
推荐指数
1
解决办法
2821
查看次数

python.h在尝试安装gevent-socketio时并不喜欢

当我尝试安装gevent-socketio时,这是我的错误

安装收集的软件包:gevent,greenlet为gevent构建'gevent.core'扩展运行setup.py安装gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes> -fPIC -DLIBEV_EMBED = 1 -DEV_COMMON = -DEV_CHECK_ENABLE = 0 -DEV_CLEANUP_ENABLE = 0> -DEV_EMBED_ENABLE = 0 -DEV_PERIODIC_ENABLE = 0 -Ibuild/temp.linux-x86_64-2.7/libev -Ilibev> -I/usr/include/python2.7 -c gevent/gevent.core.c -o build/temp.linux-x86_64-2.7/gevent/gevent.core.o gevent/gevent.core.c:17:20:致命错误:Python.h:没有这样的文件或目录编译终止.错误:命令'gcc'失败,退出状态1完成输出命令/ usr/bin/python -c"import setuptools; file ='/ var/www/bleu/build/gevent/setup.py'; exec(compile(打开(文件).read()替换( '\ r \n', '\n'),文件, 'EXEC'))"安装--single-版本外部管理--record的/ tmp/pip- _kv6Fy-record/install-record.txt:正在运行安装

运行构建

运行build_py

运行build_ext

建立'gevent.core'扩展

gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC> -DLIBEV_EMBED = 1 -DEV_COMMON = -DEV_CHECK_ENABLE = 0 -DEV_CLEANUP_ENABLE = 0 -DEV_EMBED_ENABLE …

python django gevent-socketio

8
推荐指数
1
解决办法
3845
查看次数

gevent-socketio nginx uwsgi不能在开发服务器上一起工作

我正在运行一个使用gevent-socketio的django项目.

出于某种原因,在我的开发服务器上,我的所有websockets请求都返回一条101 pending消息,socketio将开始循环通过导致pending状态的所有其他协议.

我的uwsgi日志中的错误是:

2013/05/23 16:09:08 [error] 14485#0: *85 upstream timed out (110: Connection timed out) while reading upstream, client: x.x.x.x, server: dev.proj.co, request: "GET /socket.io/1/xhr-polling/116404981619?t=1369325348489 HTTP/1.1", upstream: "http://127.0.0.1:4042/socket.io/1/xhr-polling/116404981619?t=1369325348489", host: "dev.proj.co", referrer: "http://dev.proj.co/map/bycon/"
Run Code Online (Sandbox Code Playgroud)

在本地,我没有这个问题.我使用启动服务器python run.py

在我的本地环境中运行

#!/usr/bin/env python
import os
import sys

from gevent import monkey
monkey.patch_all()

import django.core.handlers.wsgi
from socketio.server import SocketIOServer

import os

PORT = 8000

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proj.settings")
application = django.core.handlers.wsgi.WSGIHandler()
PROJECT_DIR            = os.path.realpath(os.path.dirname(__file__))
sys.path.insert(0, PROJECT_DIR)
sys.path.insert(0, os.path.join(PROJECT_DIR, "chat"))

if __name__ == '__main__': …
Run Code Online (Sandbox Code Playgroud)

django nginx gevent uwsgi gevent-socketio

7
推荐指数
1
解决办法
2543
查看次数

在Gevent Socket-IO中使用Flask Session

早上好,

我遇到了一些麻烦,我希望有人能在这里帮助我.我想要做的是访问Gevent Socket-IO Name空间中的Flask会话.

我曾尝试将beaker用作中间件客户端,但我仍然无法从socket-io名称空间中访问和更新会话信息.

我对这一切都很陌生,所以任何帮助都将不胜感激.

beaker flask gevent-socketio

6
推荐指数
1
解决办法
820
查看次数

Nginx和Flask-socketio Websockets:Alive但不是Messaging?

我在使用Python Flask-socketio库(基于gevent)很好地使用Nginx时遇到了一些麻烦.目前,由于我们正在积极开发,我试图让Nginx作为代理工作.对于发送页面,我可以通过直接运行flask-socketio app或者通过gunicorn来实现这一点.一个问题:websocket消息传递似乎不起作用.页面已成功托管和显示.但是,当我尝试使用websockets时,它们不起作用.它们还活着,websocket认为它已连接,但它们不会发送消息.如果我删除Nginx代理,它们确实有效.我尝试发送消息时Firefox给出了这个错误:

Firefox无法在ws:///socket.io/1/websocket/上建立与服务器的连接.

Web地址是服务器所在的位置,唯一ID只是一堆随机数字.它似乎足以保持连接的生效(例如,客户端认为它已连接),但不能通过websocket发送消息.我不得不认为这个问题与代理的某些部分有关,但是在调试问题时遇到了麻烦(部分原因是这是我第一次使用Flask-socketIO和nginx).我用于nginx的配置文件是:

user       <user name>;  ## This is set to the user name for the remote SSH session
worker_processes  5;

events {
  worker_connections  1024;  ## Default: 1024
}

http {
  default_type application/octet-stream;
  log_format   main '$remote_addr - $remote_user [$time_local]  $status '
    '"$request" $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
  sendfile     on;
  server_names_hash_bucket_size 128; # this seems to be required for some vhosts

  server {
    listen 80;
    server_name _;
    location / {
        proxy_pass http://localhost:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection …
Run Code Online (Sandbox Code Playgroud)

sockets nginx flask socket.io gevent-socketio

5
推荐指数
1
解决办法
5042
查看次数

Flask-socketio,向另一个命名空间发出事件

我正在使用 Flask-socketio ( http://flask-socketio.readthedocs.org/en/latest/ )。

我目前正在得到一个

KeyError: '/local'
Run Code Online (Sandbox Code Playgroud)

在 events.py 中使用它时。注意不同的命名空间:

@socketio.on('connect', namespace='/photo')
def client_connect():
    emit('event', { 'type': 'client_connect' }, namespace='/local')
Run Code Online (Sandbox Code Playgroud)

使用 Flask-socketio 是否可以将事件发送到单独的命名空间?文档似乎表明了这一点,但我无法弄清楚为什么我不断收到 KeyError。

编辑:感谢@Miguel提出的答案,我再次尝试了(在离开该项目很长时间之后),但仍然收到以下关键错误:

@socketio.on('connect', namespace='/local')
def local_client_connect():
    print ('Local client connected.')

@socketio.on('connect', namespace='/photo')
def client_connect():
    print ('Client connected.')
    send('client_connect', namespace='/local')
Run Code Online (Sandbox Code Playgroud)

当我运行该应用程序时,我看到打印的“本地客户端已连接”。只有这样我才允许客户端访问 /photo 路由。我看到打印了“客户端已连接”,当然还有密钥错误。

我已经将flask-socketio升级到0.4.2。

最好的

安德鲁

python flask socket.io gevent-socketio

5
推荐指数
2
解决办法
9724
查看次数

flask-socketio每个用户一个房间?昂贵?

我有一个运行pandas的烧瓶webapp,可以在后端进行一些数据分析.

现在,我采用了朴素的方法,使用AJAX让用户将查询发送回服务器并与数据进行交互.但事实证明每个请求都有很多开销,每次我需要将数据重新加载到pandas/memory中,这是非常重复的.

我认为socketio在这里很有用 - 我会打开一个套接字连接,这样一旦文件加载到pandas中,用户就可以通过套接字以更少的开销响应性地交互和查询数据.

所以我现在的问题是:

  • 我应该为每个用户打开一个房间,因为用户不需要互相交流吗?
  • 这是否规模 - 为每个用户开放一个房间?
  • 命名空间在哪里适合?我是否将命名空间分配给网站的不同部分,并进一步为每个用户打开每个命名空间下的空间?
  • 或者我应该生成一个猴子修补线程?每个用户的Greenlet?

flask socket.io pandas gevent-socketio flask-socketio

5
推荐指数
1
解决办法
952
查看次数

Flask-SocketIO 无法在 Apache/WSGI 上工作

我使用了http://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent/page/4中的以下示例代码,当我使用测试服务器运行它时,效果很好,例如python myapp.py我可以连接到它并发送消息

from flask import Flask, render_template
from flask.ext.socketio import SocketIO, emit

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)

@app.route('/')
def index():
    return render_template('index.html')

@socketio.on('my event', namespace='/test')
def test_message(message):
    emit('my response', {'data': message['data']})

@socketio.on('my broadcast event', namespace='/test')
def test_message(message):
    emit('my response', {'data': message['data']}, broadcast=True)

@socketio.on('connect', namespace='/test')
def test_connect():
    emit('my response', {'data': 'Connected'})

@socketio.on('disconnect', namespace='/test')
def test_disconnect():
    print('Client disconnected')

if __name__ == '__main__':
    socketio.run(app)
Run Code Online (Sandbox Code Playgroud)

问题是,当我将相同的代码移动到使用 Apache 为 Flask 提供服务的服务器时,我收到错误。

RuntimeError: You need to use a gevent-socketio …
Run Code Online (Sandbox Code Playgroud)

python apache flask gevent-socketio flask-socketio

5
推荐指数
1
解决办法
5957
查看次数