尝试访问所有数据时,烧瓶WTForm数据返回csrf_token

时间:2018-10-25 20:09:21

标签: python flask flask-wtforms

我正在使用Flask WTForm,并尝试使用<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js" type="text/javascript"></script> <script src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js" type="text/javascript"></script> 从烧瓶烧瓶WTForm中获取数据,但该字段之一返回form.data

我的文件结构如下

csrf_token

forms.py

$ tree .
.
└── testing_app
    ├── __init__.py
    ├── forms.py
    ├── templates
    │   ├── index.html
    │   └── submit.html
    └── views.py

views.py

from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired

class MyForm(FlaskForm):
    name = StringField('name', validators=[DataRequired()])

index.html

from flask import Flask, render_template, redirect

from testing_app import forms

app = Flask(__name__)

app.config['SECRET_KEY'] = b'randomkey'

@app.route('/submit', methods=('GET', 'POST'))
def submit():
    form = forms.MyForm()
    if form.validate_on_submit():
        app.logger.debug(form.data)
        return redirect('/')
    return render_template('submit.html', form=form)

@app.route('/', methods=('GET', 'POST'))
def index():
    return render_template('index.html')

submit.html

<html>
    this is index page
</html>

我使用

<form method="POST" action="/submit">
    {{ form.csrf_token }}
    {{ form.name.label }} {{ form.name(size=20) }}
    <input type="submit" value="Go">
</form>

当我转到export FLASK_APP=testing_app/views.py export FLASK_DEBUG=1 flask run * Serving Flask app "testing_app.views" * Forcing debug mode on * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 245-821-651 并单击名称为http://127.0.0.1:5000/submit的{​​{1}}时,它将重定向到ok并以

记录数据
test

有没有没有http://127.0.0.1:5000/的{​​{1}}的方法?

我知道,我可以访问-------------------------------------------------------------------------------- DEBUG in views [/Users/nile2691/my_tests/testing_app/views.py:13]: {'csrf_token': 'TOKEN', 'name': 'test'} -------------------------------------------------------------------------------- 127.0.0.1 - - [25/Oct/2018 15:03:34] "POST /submit HTTP/1.1" 302 - 127.0.0.1 - - [25/Oct/2018 15:03:34] "GET / HTTP/1.1" 200 - ,但是我必须尝试的地方是它有data个字段,而我试图避免对每个字段都做。

我也可以喜欢

csrf_token

但是如果我们在form.name中添加15for key, value in form.data.items(): if key == 'csrf_token`: continue # process with other data 也将返回该值。

我正在寻找烧瓶方式,仅从表单中获取SubmitFieldForm字段。

2 个答案:

答案 0 :(得分:1)

如果您的所有数据在Flask-WTF中均有效,则访问为

form.name_of_input_field.data

在您的示例中是:

form = forms.MyForm()
if form.validate_on_submit():
    app.logger.debug(form.name.data) # not form.data
    return redirect('/')
return render_template('submit.html', form=form)

看看我的例子: create article form permalink to creating article

答案 1 :(得分:1)

表单对象具有_fields属性,该属性包含表单中的所有字段。如果您对此进行迭代,则可以访问字段名称,数据和类型,并且可以构建仅包含所需字段类型的数据字典。以下应该起作用。

data = {field.name: field.data for field in form._fields.values() if type(field) in (StringField, SelectField)}