Soy un novato en desarrollo web, pero haré todo lo posible para aclarar el problema, explicar mi enfoque y lo que he intentado. También incluyo importaciones en caso de que estén causando el problema, pero estoy bastante seguro de que lo he aislado a lo que describo.
Estoy tratando de usar Flask-session para mantener la información privada, pero algunos valores se "pierden". Este código se ha recortado significativamente para simplificar. El usuario aterriza en /send y renderizamos la plantilla de carga. loading.js hace fetch() en /deploy mientras ejecuta una animación, luego() vamos a /results cuando la función de implementación finaliza.
cargando.js
function navigate() { window.location.href = 'results'; // redirect to results page when done! } // deploy the contract while the loading screen goes then navigate to results page const data = fetch('deploy').then(navigate); loopThroughMessages(messages);principal.py
from flask_session import Session app = Flask(__name__, static_folder='static', template_folder='templates') # for the session, ie passing values app.config["SESSION_PERMANENT"] = False app.config["SESSION_TYPE"] = "filesystem" app.config.from_object(__name__) Session(app) @app.route('/send') def main(): # take url parameters and do stuff with them return render_template('loading.html') @app.route("/deploy") def deploy_contract(): session['contract_address'] = some_fnc() # fetch() requires that this function return a json return {} @app.route("/results") def serve_results_page(): # pull saved values from the session data = {'contract_key' : session['contract_address'] } # calling session here causes the error, the contract_address key doesn't exist return render_template('results.html', data=data) Entonces contract_address se guarda en la sesión, pero cuando llegamos a /results , el servidor no tiene forma de asociar esa sesión con el cliente.
Queremos mantener privada nuestra contract_address , por lo que enviarla a loading.js no es una opción. Supongo que, dado que http no tiene estado, necesito pasar una cookie hacia y desde mis archivos js y python, pero estoy un poco perdido sobre cómo implementarlo. ¿Son innecesarias las cookies (porque el servidor en realidad no necesita recibir ningún dato de mis archivos js)? ¿Debería usar redireccionamientos o algo además de fetch ()?
Las correcciones de trucos, los diferentes enfoques y los recursos son bienvenidos. Siento que estoy cerca, como si hubiera una manera simple de usar cookies que estoy pasando por alto.
Continuaré investigando y detallando los enfoques que estoy considerando Edit1: Mirando el método should_set_cookie de Flask
Intente fetch con credenciales: 'incluir' para que los navegadores envíen una solicitud con credenciales incluidas en las llamadas del lado del servidor:
fetch('deploy', { method: 'GET', credentials: 'include' }).then(navigate); Con esto, accederá a session['contract_address'] en la ruta de results .
La flask-session establece una cookie con una sesión clave en su navegador, busque con credentials:'include' incluye este valor de cookie en la llamada de red.
La sesión en el matraz se implementa como una sesión de cliente, guardando todo el contenido de la sesión como cookies de cliente. La extensión flask-session proporciona otro almacenamiento de servidor para la sesión. Por ejemplo app.config["SESSION_TYPE"] = "filesystem" guarda el contenido de la sesión en un archivo en el servidor.
Pero ambos enfoques aún dependen de Cookie . El almacenamiento de la sesión del lado del servidor necesita obtener un session_id de la Cookie del cliente.
Debe habilitar el envío de cookies en Fetch API.