Как добавить диалог подтверждения для POST-запроса с Flask? - PullRequest
0 голосов
/ 11 октября 2018

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

Это форма отправки основной формы.При отмене он просто обновляет данные на текущей странице, выполняя запрос get для конфигурации.Но при применении он отправляет запрос POST / подтверждает маршрут

main.html

<form class="module-form pure-form pure-form-aligned" autocomplete="off" id="uguu">
<fieldset>
   <div id="export-settings" class="module-block insight-border">
         <div class="pure-control-group">
            {{ form.export_server.label }}
            {{ form_input(form.export_server, maxlength=255) }}
         </div> 
         <div class="pure-control-group">
            {{ form.export_port.label }}
            {{ form_input(form.export_port) }}
         </div>
         <div class="submit-button-group">
            <button class="pure-button pure-button-primary" type="submit" 
                    formaction="confirm" formmethod="post">Apply</button>
            <button class="pure-button pure-button-primary cancel" type="submit"
                    formaction="config" formmethod="get">Cancel</button>
          </div>
    </div>
</fieldset>
</form>

Это сегмент кода на сервере фляги

@config_page.route("/config", methods=["GET", "POST"])
def config():
    if request.method == "POST":
         return post_config() #Uses request.form
    return get_config()


@config_page.route("/confirm", methods=["POST"])
def confirm():
    with ClassA() as class_a:
        class_a.load()
        #Need to show the confirmation only on this condition
        if class_a.is_val_x and request.form['is_val_x'] == 'on':
            #Is this the right way to go about it?
            return render_template('confirm.html', form=request.form ) 

    return redirect(url_for('.config',form=request.form),code=307) 

Anнаконец, сегмент кода в verify.html.Запрос get работает нормально, но я не уверен, как отправить данные формы из колбы / подтвердить маршрут в / config.Я даже не уверен, что это правильный способ сделать это.Любая помощь будет действительно приветствоваться?Любое решение, возможное в jQuery или javaScript, также приветствуется.

<div> Are you sure kind of dialog? </div>
<form>
   <button class="pure-button pure-button-primary deny" type="submit"  
                formaction="config" formmethod="get">Cancel</button>

   <button class="pure-button button-warning confirm" type="submit" 
                formaction="config" formmethod="post">Confirm</button>
</form>

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Что ж, при работе с колбой у вас должен быть отдельный файл forms.py, в котором вы будете создавать все свои формы и использовать шаблонизаторы jinja2.

Как бы я сделал что-то подобное, создав такие вещи:

1.app / forms.py

from flask_wtf import FlaskForm
from wtforms import StringField, BooleanField, SubmitField
from wtforms.validators import DataRequired

class ConfigForm:
    conf1 = StringField('Config 1', validators=[DataRequired()])
    conf2 = StringField('Config 2', validators=[DataRequired()])
    confirm = BooleanField('Cnfirm')
    submit = SubmitField('Submit')

2.app / templates / config.py

<html>
<body>
    <h1>Config</h1>
    <p>
        {{ form.conf1.label }}<br>
        {{ form.conf1(size=(42) }}
        {% for error in form.conf1.errors %}
        <span style="color: red;">[{{ error }}]</span>
        {% endfor %}
    </p>
    <p>
        {{ form.conf2.label }}<br>
        {{ form.conf2(size=(42) }}
        {% for error in form.conf2.errors %}
        <span style="color: red;">[{{ error }}]</span>
        {% endfor %}
    </p>
    <p>{{ form.submit() }}</p>
</body>
</html>

3.app / rout.py

from flask import Flask render_template, redirect, url_for, request
from forms import ConfigForm


app = Flask(__name__)

@app.route('/config/<confirm>', methods=['GET', 'POST'])
def config(confirm):
    form = ConfigForm()
    if form.validate_on_submit():
        if form.validate_on_submit():
            db.get.value1.for.form = form.conf1.data
            db.get.value2.for.form = form.conf2.data
            if confirm:
                db.get.value3.form = form.confim.data

            db.session.commit()

            flash('You\'r changes have been saved!')
            return redirect(url_for('config'))
        elif request.method == 'GET':
            form.conf1.data = db.get.value1.for.form
            form.conf2.data = db.get.value2.for.form

    return render_template('config.html', form=form)


@app.route('/')
def index():
    confirm = True
    return redirect(url_for('config', confirm))

Что я здесь делаю, так это то, что я создаю страницу конфигурации, где данные загружаются из базы данных, и на тот случай, если пользователь захочет обновить данные в посте.метод я обновлю данные в базе данных.

В моем примере, если пользователь войдет на страницу / index, он перенаправит на страницу cinfig и передаст confim = True, который будет обновлен вместе с методом post без каких-либо действий пользователя.необходимо.

Я надеюсь, что этот пример поможет вам найти решение, которое вам нужно.:)

0 голосов
/ 11 октября 2018

Как вы сказали, запрос get работает нормально.Так что вы должны видеть шаблон verify.html.Отредактируйте тег формы.

<form method="POST" action="./config">
<button class="pure-button pure-button-primary deny" type="submit"  
            formaction="config" formmethod="get">Cancel</button>

<button class="pure-button button-warning confirm" type="submit" 
            formaction="config" formmethod="post">Confirm</button>
</form>

Теперь, когда вы нажмете «Подтвердить» на сегменте кода, вы можете распечатать данные запроса, отладить поля формы.

@config_page.route("/config", methods=["GET", "POST"])
def config():
if request.method == "POST":
 print(request)
 return post_config() #Uses request.form
return get_config()

Если вы хотите отправить форму, используяAJAX / JQuery, вы можете сделать это.

<script type="text/javascript">
  $('.confirm').click(function (e) {
    e.preventDefault();
    $.ajax({
        url: "./config",
        type: 'post',
        dataType: "json",
        data: {
            search: request.term, request: 1
        },
        success: function (data) {
            response(data);
        }
    });
   }
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...