Flask-socketio: flask socketio 400 (BAD REQUEST)

Created on 23 Jul 2016  路  14Comments  路  Source: miguelgrinberg/Flask-SocketIO

I'm trying to use flask socketio to retrieve some live tweets and currently I'm playing around with the socketio to see how it works. But in my test, I get 400 (BAD REQUEST) from time to time. I'm wondering what is the issue.

here's the error sample:

socket.io.js:3511 POST http://127.0.0.1:5000/socket.io/?EIO=3&transport=polling&t=LOMYW0D&sid=c81baa220764437184a14366357c6d3d 400 (BAD REQUEST)Request.create @ socket.io.js:3511Request @ socket.io.js:3424XHR.request @ socket.io.js:3352XHR.doWrite @ socket.io.js:3365(anonymous function) @ socket.io.js:3884(anonymous function) @ socket.io.js:4747proxy @ socket.io.js:1197(anonymous function) @ socket.io.js:4762(anonymous function) @ socket.io.js:4742exports.encodePacket @ socket.io.js:4541encodeOne @ socket.io.js:4741eachWithIndex @ socket.io.js:4760map @ socket.io.js:4767exports.encodePayload @ socket.io.js:4746Polling.write @ socket.io.js:3883Transport.send @ socket.io.js:2912Socket.flush @ socket.io.js:2623Socket.sendPacket @ socket.io.js:2683Socket.ping @ socket.io.js:2587(anonymous function) @ socket.io.js:2574 socket.io.js:3511 GET http://127.0.0.1:5000/socket.io/?EIO=3&transport=polling&t=LOMYPYb&sid=c81baa220764437184a14366357c6d3d 400 (BAD REQUEST)Request.create @ socket.io.js:3511Request @ socket.io.js:3424XHR.request @ socket.io.js:3352XHR.doPoll @ socket.io.js:3382Polling.poll @ socket.io.js:3795Polling.onData @ socket.io.js:3834(anonymous function) @ socket.io.js:3385Emitter.emit @ socket.io.js:4389Request.onData @ socket.io.js:3546Request.onLoad @ socket.io.js:3627xhr.onreadystatechange @ socket.io.js:3499 socket.io.js:3511 POST http://127.0.0.1:5000/socket.io/?EIO=3&transport=polling&t=LOMYeOF&sid=c81baa220764437184a14366357c6d3d 400 (BAD REQUEST)

my server side code (python flask):

from flask import Flask
from flask_socketio import SocketIO
app = Flask(__name__)
app.config["SECRET_KEY"] = "secret!"
socketio = SocketIO(app)

def root():
    return app.send_static_file("index.html")

@socketio.on("connect", namespace="/npTweet")
def connectServer():
    print("Client connected")
    socketio.emit("connected", namespace="/npTweet")


@socketio.on("startTweets", namespace="/npTweet")
def tweetStreaming():
    print("Start streaming tweets...")
    socketio.emit("streamTweets", {"stream_result": "test"}, namespace="/npTweet")


if __name__ == "__main__":
    socketio.run(app, debug=True)

my client side code:

socket = io.connect("http://" + document.domain + ":" + location.port + "/npTweet");
console.log("http://" + document.domain + ":" + location.port + "/npTweet");
// listen to the event 'connected'
socket.on("connected", function(data){
  console.log("listening connected...");
  socket.emit("startTweets")
});

socket.on("streamTweets", function(data){
  console.log("listen streamTweets...");
  console.log(data.stream_result)
});

These are the initial output when I start the index.html page:

http://127.0.0.1:5000/npTweet
listening connected...
listen streamTweets...
test

but after like 30 second or so, it began to have the previous 400 bad request error, followed by the following result:

listening connected...
listen streamTweets...
test

Then after like 30 seconds, it does the bad request and the result all over again. where am I doing wrong? any help will be appreciated.

for the client side, I'm using socketio js 1.4.5
for python:
Flask-SocketIO==2.5
python-engineio==0.9.2

invalid

Most helpful comment

what do you mean? can you point out where in the docs?

in my python code, I have:

if name == "main":
socketio.run(app, debug=True)

All 14 comments

What is your web browser? Or in other words, how do you start the Flask-SocketIO server?

I鈥檓 using chrome Version 51.0.2704.103 (64-bit). I just access my index.html through chrome

How do you run the server?

I just use the linux command: flask run

Read the docs. Flask-SocketIO uses a different method for server start up.

what do you mean? can you point out where in the docs?

in my python code, I have:

if name == "main":
socketio.run(app, debug=True)

You need to run the script, so that socketio.run executes. If you do flask run you are using Flask's own server, which knows nothing about SocketIO.

I think the docs could use some more detail here that is specifically addressed to Flask's 0.11 and its new CLI.

ok, I got it, now it works. Thanks!

@BoYanSTKO what did you change to make it work?

I'm starting the server with gunicorn, having the same issue:
gunicorn --worker-class eventlet --bind 0.0.0.0:5000 myapp.run:app

@akapit I just replied to your comment on the blog. Your 400 error is caused by the cross-origin policy. Your browser is reporting an origin that is not supported by the server. You may want to write a new issue and indicate how you initialize your Socket.IO server (and in particular if you set any of its CORS options), and if/how you configure CORS for your Flask application.

@ miguelgrinberg thanks for your answer, I've just wrote a new issue with those details. Let me know if I can provide anything else. Gracias!

@miguelgrinberg Hola Miguel, estoy teniendo el mismo problema. Estoy utilizando el websocket para retransmitir tweets, y de vez en cuanto me salta en error 400 bad request. Una vez ser reconecta, la retransmisi贸n sigue pero se me repiten los tweets (por poner un ejemplo de las consecuencias). Sabes c贸mo puede solucionarse? Gracias de antemano!
Lo ejecuto de la siguiente manera:

(English: I麓m having the same issue!. I麓m using the websocket for streaming tweets in the web app, and from time to time 400 bad request shows up, causing two identical tweets to be retransmited (as an example of the issues). Do you know how could be fixed? thanks!

if __name__ == '__main__':
socketio.run(app, debug=True, host='127.0.0.1')

@Alexcorrochano los errors 400 pueden ocurrir por muchas razones. Tendrias que averiguar cual es el problema en tu caso. Si activas los logs quiza sea mas claro.

Was this page helpful?
0 / 5 - 0 ratings