关于python:Flask SocketIO和uWSGI导致’TypeError:’SocketIO’对象不可调用’

Flask SocketIO & uWSGI causes 'TypeError: 'SocketIO' object is not callable'

我目前正在构建一个结合使用Flask和Flask SocketIO来处理HTTP和WebSocket流量组合的应用程序。 在将我的应用程序部署到服务器上并将uWSGI和Nginx添加为网关之后,wsgi脚本在日志中给我以下错误:

1
2
TypeError: 'SocketIO' object is not callable
[pid: 4262|app: 0|req: 3/8] XXX.XXX.XXX.XXX () {46 vars in 912 bytes} [Tue Jul 11 14:57:25 2017] GET / => generated 0 bytes in 0 msecs (HTTP/2.0 500) 0

如uWSGI文档中所述,我在配置文件中将set http-websockets标志添加为true。 Flask SocketIO文档声明他们支持uWSGI:

The other alternative is to use the uWSGI web server, which comes with WebSocket functionality. The use of gevent is also a performant option, but slightly lower than eventlet.

有人知道我在做什么错吗? 我正在使用最新版本的Nginx。 我在这里先向您的帮助表示感谢。 我的设置:

烧瓶服务器(mymod.server)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from flask import Flask
from flask_socketio import SocketIO, emit


server = Flask(__name__)
io = SocketIO(server)

@server.route("/")
def index():
    return server.send_static_file("index.html")

@io.on("ping")
def ping():
    emit("pong")

WSGI脚本(项目的根)

1
2
3
4
from mymod.server import io

if __name__ =="__main__":
    io.run(host="127.0.0.1", port=8080)

WSGI配置

1
2
3
4
5
6
7
8
9
10
11
12
# Configuration file for Nginx
[uwsgi]
module = wsgi:io
master = true
processes = 5
buffer-size=32768
http-websockets = true
socket = server.sock
chmod-socket = 666
vacuum = true
die-on-term = true
logto = /var/log/uwsgi/%n.log

Nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
    listen 443 http2 ssl;
    listen [::]:443 http2 ssl;

    server_name _;
    server_tokens off;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/user/project/server.sock;
    }

    location /socket.io/ {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection"upgrade";
        proxy_pass http://unix:/home/user/project/server.sock;
    }
}

我如何启动服务器

1
$ uwsgi --ini config.wsgi.ini

事实证明,Flask-SocketIO可以简单地安装到原始的app对象上,替换以下内容:

1
2
[uwsgi]
module = wsgi:io

至:

1
2
[uwsgi]
module = wsgi:app

可以,但是uwsgi对SocketIO仍然有可怕的支持,从我所听说的情况来看,使gunicorn成为更好的选择。