【问题标题】:Flask-WTF isn't processing my form responseFlask-WTF 没有处理我的表单响应
【发布时间】:2011-10-20 02:45:11
【问题描述】:

我正在使用 Flask (vsn 0.8) 和 Flask-WTF (vsn 0.5.2)(例如,解析表单)来制作一个非常简单的网站。但是,我无法让 Flask-WTF 正确解析我的 GET 结果。

我的相关代码如下所示:

@app.route("/result", methods=("GET", "POST"))
def submit():
    form = MyForm()
    print request.args
    print request.args.get('aws_id', None, type=str)
    print form.is_submitted()
    if form.validate_on_submit():
        flash('Success')
        aws_id = form.aws_id.data
    return render_template("index.html", form=form)

如果我使用 GET 提交包含名为“aws_id”的单个字段的表单,我会在控制台上获得以下输出。

127.0.0.1 - - [19/Oct/2011 22:28:59] "GET /result?aws_id=test_string HTTP/1.1" 200 -
ImmutableMultiDict([('aws_id', u'test_string')])
test_string
False

在我看来,提交工作正常,但 Flask-WTF 并没有做它的事情。本质上,处理表单输出的旧方法是 request.args.get 方法,但新的 form.is_submitted 和 form.validate_on_submit 并没有发挥它们的魔力。

有什么想法吗? (WTF!)

【问题讨论】:

    标签: python flask flask-extensions


    【解决方案1】:

    Flask-WTF 的Formis_submitted 方法看起来像:

    def is_submitted(self):
        """
        Checks if form has been submitted. The default case is if the HTTP
        method is **PUT** or **POST**.
        """
    
        return request and request.method in ("PUT", "POST")
    

    并且在其__init__ 中有这个代码,通常可以确保表单数据从 Flask 请求中自动加载:

        if formdata is _Auto:
            if self.is_submitted():
                formdata = request.form
    

    所以很明显...如果您通过 GET 提交表单,您不会得到任何好的自动行为。这是可以理解的,因为如果它是一个 GET 请求,则不清楚是表单已提交还是您只是在加载页面。这不包括任何 CSRF 问题。

    validate_on_submit 也不起作用,因为它还依赖于is_submitted

    Flask 本身也不会为您将 GET 字段解析为 request.form

    你最终不得不做这样的事情:

    form = MyForm(request.args, csrf_enabled=False)
    if 'aws_id' in request.args and form.validate():
        flash('Success')
        aws_id = form.aws_id.data
    

    (都假设您的 MyForm 类继承自 from flask.ext.wtf import Form

    【讨论】:

      【解决方案2】:

      我将我的应用程序移至站点的根目录,删除了存在的应用程序 (=redundant),并将 request.form 添加到 MyForm 类。这似乎可以解决它。还需要将csrf_enabled 设置为false。

      @app.route("/", methods=("GET", "POST"))
      def submit():
          form = MyForm(request.form, csrf_enabled=False)
          if form.validate_on_submit():
              print form.data
      
          return render_template("index.html", form=form)
      

      【讨论】:

      • 虽然这个答案相当陈旧,但我认为应该提到的是,应该考虑确保您可以使用 csrf ENABLED 进行这项工作(请参阅docs)。 csrf 是一种相当简单的方法来防止对您的网站进行常见类型的攻击。禁用 csrf 只能用于测试目的。
      • Nick 很可能忘记将 CSRF 字段添加到表单的视图中,因此无法验证。这是我的问题,直到我意识到发生了什么。
      • 如果表单在 HTML 中有action="GET",那么您在使上述代码正常工作时遇到其他问题,请参阅我的回答
      猜你喜欢
      • 1970-01-01
      • 2015-05-18
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多