【问题标题】:How to add confirmation dialog for POST request with Flask?如何使用 Flask 为 POST 请求添加确认对话框?
【发布时间】:2018-10-11 05:21:10
【问题描述】:

第一次使用 Flask。我正在尝试为表单添加确认对话框,但仅在某些条件下。所以我无法在客户端执行此操作。我能够为 GET 请求添加它,但我无法为 POST 请求添加它,因为我需要传递表单数据。这是我所做的。

这是主表单的表单提交。在取消时,它只是通过执行获取配置请求来刷新当前页面上的数据。但是在 Apply 上,它会向 /confirm route 发出 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) 

最后是confirm.html 中的代码段。获取请求工作正常,但我不确定如何将表单数据从烧瓶 /confirm 路由发布到 /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>

【问题讨论】:

    标签: javascript python html flask


    【解决方案1】:

    正如您所说,获取请求工作正常。所以你一定会看到模板confirm.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>
    

    【讨论】:

    • 我添加了
    • 没有得到初始形式,你能不能也提供一下。
    • @对不起这个名字。它是main.html中的表单
    • 让我们在这里清除一些您希望您的表单单击 sumbit 以确认 url 并单击取消以配置 url。
    • 是的。有点儿。单击提交的表单必须发布到配置 url,但必须仅在某些条件下才能确认 url。在确认 url 中,单击取消将获取配置 url,是将发布到配置 url。
    【解决方案2】:

    在烧瓶方式中,您应该有单独的 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/routes.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))
    

    我在这里做的是创建配置页面,从数据库中加载数据,如果用户希望在 post 方法中更新数据,我会将数据更新到数据库中。

    在我的例子中,如果用户进入 /index 页面,它会重定向到 cinfig 页面并传递 confim = True ,它将与 post 方法一起更新,无需任何用户操作。

    我希望这个示例至少可以帮助您找到所需的解决方案。 :)

    【讨论】:

    • 这里有点不清楚。我实际上想要一个用户操作,他们可以在其中确认操作。例如,如果 db.get.value1 当前处于打开状态,并且说用户正在关闭 conf1,则 form.conf1 是敏感的。我想提示用户是否真的想这样做。您的建议看起来就像没有用户交互。
    • 啊,好的。对不起,不清楚的回应,试试这个,因为我认为你需要什么:stackoverflow.com/questions/32911578/flask-confirm-action
    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    相关资源
    最近更新 更多