Данные Flask WTForm возвращают csrf_token при попытке доступа ко всем данным - PullRequest
0 голосов
/ 25 октября 2018

Я использую Flask WTForm и пытаюсь получить данные из колбы WTForm, используя form.data, но в качестве одного из полей возвращается csrf_token.

Структура моего файла такая же, как показано ниже

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

forms.py

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

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

views.py

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')

index.html

<html>
    this is index page
</html>

submit.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 инажмите на ok с именем как test, он перенаправит на http://127.0.0.1:5000/ и зарегистрируйте данные как

--------------------------------------------------------------------------------
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, но там, где я должен попробовать, у него есть 15 поля, и я стараюсь не делать для каждого поля.

Я также могу сделать как

for key, value in form.data.items():
    if key == 'csrf_token`:
        continue
    # process with other data

но если мы добавим SubmitField в Form, form.data также вернет это.

Я ищу способ фляги, чтобы получить только string или selection поле из формы.

Ответы [ 2 ]

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

Объект формы имеет свойство _fields, которое содержит все поля в форме.Если вы выполните итерацию этого, у вас будет доступ к имени, данным и типу поля, и вы сможете создать свой собственный диктант данных, содержащий только те типы полей, которые вам нужны.Следующее должно работать.

data = {field.name: field.data for field in form._fields.values() if type(field) in (StringField, SelectField)}
0 голосов
/ 26 октября 2018

Вы получаете доступ ко всем своим данным, если они действительны в 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)

Посмотрите на мой пример: Создать форму статьи Постоянная ссылка на создание статьи

...