Как передать переменную между страницами Flask?

Предположим, что у меня следующий случай:

@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
  ....

На странице с запаздыванием есть одна ссылка, которая направляет страницу /a в/b. Я пытаюсь передать переменную a на страницу /b для ее повторного использования. Как мне сделать это приложение Flask? Нужно ли использовать сеанс или есть ли другое решение?

Ответ 1

Если вы хотите передать некоторое значение python, которое пользователь не должен видеть или контролировать, вы можете использовать сеанс:

@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

Сессия ведет себя как dict и сериализуется в JSON. Таким образом, вы можете поместить в сеанс все, что JSON сериализует. Тем не менее, обратите внимание, что большинство браузеров не поддерживают сессионный cookie размером более ~ 4000 байт.

Следует избегать помещения больших объемов данных в сеанс, поскольку они должны отправляться клиенту и от него при каждом запросе. Для больших объемов данных используйте базу данных или другое хранилище данных. См. Являются ли глобальные переменные безопасными в потоке Как я могу делиться данными между запросами? и хранить большие данные или служебное соединение на сеанс Flask.


Если вы хотите передать значение из шаблона в URL, вы можете использовать параметр запроса:

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

выдаст URL:

/b?my_var=my_value

который можно прочитать из б:

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

Ответ 2

Ссылка на маршрут /b в шаблоне для /a может содержать параметры запроса, которые вы могли бы прочитать на маршруте для /b. В качестве альтернативы вы можете сохранить значение для a в переменной сеанса для доступа к нему между представлениями.