web-dev-qa-db-fra.com

Comment passer une variable entre les pages Flask?

Supposons que j'ai le cas suivant;

@app.route('/a', methods=['GET'])
def a():
  a = numpy.ones([10,10])
  ...
  return render_template(...) # this rendered page has a link to /b

@app.route('/b', methods=['GET'])
def b():
  print a
  ....

Dans la page redéfinie, un lien dirige la page/a vers/b. J'essaie de passer la variable a à la page/b pour la réutiliser. Comment dois-je faire cette application Flask? Dois-je utiliser la session ou existe-t-il une autre solution?

17
erogol

Si vous souhaitez transmettre une valeur python que l'utilisateur n'a pas besoin de voir ou de contrôler, vous pouvez utiliser la session:

@app.route('/a')
def a():
    session['my_var'] = 'my_value'
    return redirect(url_for('b'))

@app.route('/b')
def b():
    my_var = session.get('my_var', None)
    return my_var

La session se comporte comme un dict et se sérialise au format JSON. Donc, vous pouvez mettre tout ce qui est JSON sérialisable dans la session.

Vous devez éviter de mettre de grandes quantités de données dans la session, car elles doivent être envoyées vers et depuis le client à chaque demande. Pour les grandes quantités de données, utilisez une base de données ou un autre stockage de données.


Si vous souhaitez passer une valeur d'un modèle dans une URL, vous pouvez utiliser un paramètre de requête:

<a href="{{ url_for('b', my_var='my_value') }}">Send my_value</a>

produira l'URL:

/b?my_var=my_value

qui peut être lu à partir de b:

@app.route('/b')
def b():
    my_var = request.args.get('my_var', None)
43
davidism

Le lien vers route /b dans le modèle pour /a pourrait être complété par des paramètres de requête que vous pourriez lire dans la route pour /b. Vous pouvez également stocker la valeur de a dans une variable de session pour y accéder entre les vues.

1
Matt Healy