我正在运行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客户端发送一个事件
我试图在dotcloud上在nginx(v 1.3.14)后面部署gunicorn + gevent.我有几个问题.我的目标是改编python-on-dotcloud示例.到目前为止,我还没有能够使用此设置使用websockets部分.换句话说,我必须手动刷新页面以获取更新,而不是通过socket.io.这对我来说都很新鲜,所以它可能是一个总的noob错误.这是一个相关的问题.
以下是我对python-on-dotcloud示例所做的更改.
显然nginx(从版本1.3.13开始)支持Web套接字.我从python-on-dotcloud示例更新了构建器脚本以指向此开发版本:nginx_download_url="http://nginx.org/download/nginx-1.3.14.tar.gz"
我设置gunicorn绑定到unix套接字,然后从nginx.conf设置proxy_pass,将流量上行发送到gunicorn proxy_pass http://appserver;,我已经定义了appserver.
我正在使用gevent-socket.io运行一个django应用程序,在没有运行nginx的情况下工作正常.(我只是将gunicorn绑定到dotcloud.yml中的0.0.0.0:$PORT_WWW)
我的问题是这些.
我想解决一个没问题吗?
一个.我已经做了相当多的阅读,建议将枪支放在nginx后面.在dotcloud的前线负载平衡器的背景下,这仍然是真的吗?
湾 如果我不期望我会受到DoS攻击,那么将gunicorn置于nginx后面仍然很重要吗?
我试图设置是否可以通过unix套接字运行websockets?
unix套接字是否会在dotcloud上打破缩放?
如果我需要使用端口,那么如何设置呢?我不认为我可以在同一个应用程序中分配两个http端口.如果我将它拆分为两个应用程序,那么我不确定如何将来自gunicorn应用程序的PORT_WWW环境变量传递到nginx应用程序,以便最终可用于nginx postinstall脚本,从而生成nginx.conf.
关于为什么这不起作用的任何想法?
我在下面包含了三个配置文件.让我知道其他人是否会有所帮助.谢谢!
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) 我有一个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) 当我尝试安装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 …
我正在运行一个使用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) 早上好,
我遇到了一些麻烦,我希望有人能在这里帮助我.我想要做的是访问Gevent Socket-IO Name空间中的Flask会话.
我曾尝试将beaker用作中间件客户端,但我仍然无法从socket-io名称空间中访问和更新会话信息.
我对这一切都很陌生,所以任何帮助都将不胜感激.
我在使用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) 我正在使用 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。
最好的
安德鲁
我有一个运行pandas的烧瓶webapp,可以在后端进行一些数据分析.
现在,我采用了朴素的方法,使用AJAX让用户将查询发送回服务器并与数据进行交互.但事实证明每个请求都有很多开销,每次我需要将数据重新加载到pandas/memory中,这是非常重复的.
我认为socketio在这里很有用 - 我会打开一个套接字连接,这样一旦文件加载到pandas中,用户就可以通过套接字以更少的开销响应性地交互和查询数据.
所以我现在的问题是:
我使用了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)