Flask — вернуть ту же форму, которая была отправлена

Как мне заставить Flask возвращать пользователя на ту же страницу, заполненную таким же образом, после того, как он / она отправит форму на странице? 'render_template' работает только в том случае, если я заранее знаю все переменные. Моя форма является динамической, и переменные меняются в зависимости от выбора, сделанного пользователем. См. Псевдокод ниже, чтобы понять, о чем я думаю. Я знаю, что render_template так не работает, но есть ли способ просто сказать «использовать те же значения формы, которые были получены при рендеринге шаблона?»

@app.route('./MyPage', methods=['GET', 'POST'])
def MyPage():

  if request.method == 'POST':
    # Do some stuff
    # return render_template('MyPage.html', context=request.form)
  else:
    # Do some other stuff

Уточните: вы хотите вернуть их на страницу и заполнить форму тем, что они только что отправили? Почему?

cmrussell 28.05.2019 03:53

Я пытаюсь создать файл «сохранения» того, что пользователь заполнил в формате .csv для загрузки. Я беру ввод формы и отправляю им файл .csv, чтобы они могли загрузить его позже и продолжить с того места, на котором остановились. После того, как я отправлю им файл .csv, я бы хотел направить их обратно туда, где они были, а не заставлять их заполнять его снова. Может быть, есть более простой способ сделать это? Я нуб.

DCB2524 28.05.2019 04:03
Новые приложения с использованием ChatGPT
Новые приложения с использованием ChatGPT
Я собираюсь вернуться к теме, которую уже освещал ранее, - чатгпт.
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Другой маршрут в Flask Python
Другой маршрут в Flask Python
Flask - это фреймворк, который поддерживает веб-приложения. В этой статье я покажу, как мы можем использовать @app .route в flask, чтобы иметь другую...
0
2
502
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Самый простой способ сделать загрузку так, как вы просите использовать target = "_blank" в своей форме:

<form action = "/MyPage" method = "POST" target = "_blank">
  <ul>
  {% for input in form %}
    <li>{{ input.label }} {{ input }}</li>
  {% endfor %}
  </ul>
</form>

Тогда вашему методу обработки POST не нужно ничего делать, кроме как возвращать CSV:

@app.route('/MyPage', methods=['GET', 'POST'])
def MyPage():
  if request.method == 'POST':
    # Turn `request.form` into a CSV
    # see https://stackoverflow.com/q/26997679/135978 for an example
    headers = {'Content-Disposition': 'attachment; filename=saved-form.csv', 'Content-Type': 'text/csv'}
    return form_as_csv, headers
  else:
    # Do some other stuff

Если вам нужно несколько кнопок в форме, то вместо установки target в форме вы можете просто установить formtarget = "_blank" на кнопку, которая запускает CSV:

<form action = "/MyPage" method = "POST">
  <ul><!-- ... snip ... --></ul>
  <button name = "submit_action" value = "SAVE_AS_CSV" formtarget = "_blank">Save as CSV</button>
  <button name = "submit_action" value = "RUN_CALCULATION">Run Calculation</button>
</form>

Тогда вам просто нужно добавить проверку на request.form['submit_action'] в свой блок if request.method == 'POST', и вы отправляетесь на гонки:

if request.method == 'POST':
    if request.form['submit_action'] == 'SAVE_AS_CSV':
        # Return the CSV response
    else:
        # Return the calculation response

См. также: Написание CSV из фреймворка Flask

Я должен был быть более ясным. На самом деле у меня есть несколько кнопок отправки в форме, одна для сохранения и одна для выполнения вычислений, поэтому установка цели формы на «_blank» будет работать для одной кнопки, но не для другой. Однако полезная ссылка для преобразования в .csv.

DCB2524 28.05.2019 05:12

Обновлено для поддержки нескольких кнопок форм, не делая их все target=_blank в поведении @DCB2524.

Sean Vieira 04.06.2019 19:04

Другие вопросы по теме