0

As the title states I'm having issues with accessing flask-websocket sessions from the flask functions. I have realised they are different and probably stored differently and tried to solve this using the flask-session library to no avail.

I have made some boilerplate code illustrating my problem.

from flask import Flask, session,render_template,url_for,redirect
from flask_socketio import SocketIO,join_room
app = Flask(__name__)
boards = {}
socketio = SocketIO(app)
app.secret_key = "temporary"
@app.route('/')
def index():
    return render_template('wait.html')
@app.route('/dir')
def foo():
    if "name" in session:#fails here as session is <SecureCookieSession {}> instead of {'name' : 'craig}
        pass #just a filler
    else:
        return redirect(url_for("index"))#this line will cause to repetitively go back and forward from index to foo
@socketio.on('log')
def connection(request):
    if "name" not in session:
        join_room('waiting')#in my actual code the user waits for another person
        session['name'] = 'craig'
        socketio.emit('redirect', url_for('foo'),room= 'waiting')
    else:
        pass

if __name__ == '__main__':  
   socketio.run(app ,port=5000, debug=True)

and the html:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        Waiting...
        <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js"></script>
        <script>
        const socket = io();
        socket.emit("log", { data: "connection" });
        socket.on('redirect', (dest) => {
            window.location = dest;
        });
        </script>
    </body>
</html>
1

1 Answer 1

0

Turns out flask-session did have the solution, I was just using it wrong forgetting these two lines of code when I initially tried:

Session(app)
socketio = SocketIO(app, manage_session=False)# I did not have the manage_session

I also used

session.modified = True

though I'm not sure it is strictly necessary

Here is the updated server code:

from flask import Flask, session, render_template, url_for, redirect
from flask_socketio import SocketIO, join_room
from flask_session import Session

app = Flask(__name__)
app.config['SECRET_KEY'] = 'temporary'
app.config['SESSION_TYPE'] = 'filesystem'
Session(app)
socketio = SocketIO(app, manage_session=False)

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

@app.route('/dir')
def foo():
    if "name" in session:
        name = session['name']
        return f"Hello, {name}!"
    else:
        return redirect(url_for("index"))

@socketio.on('log')
def connection(request):
    print(session)
    if "name" not in session:
        join_room('waiting')
        session['name'] = 'craig'
        session.modified = True
        socketio.emit('redirect', url_for('foo'), room='waiting')
    else:
        session.clear()

if __name__ == '__main__':  
   socketio.run(app, port=5200, debug=True)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.