首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >尝试访问所有数据时,Flask WTForm数据返回csrf_token

尝试访问所有数据时,Flask WTForm数据返回csrf_token
EN

Stack Overflow用户
提问于 2018-10-26 04:09:21
回答 2查看 496关注 0票数 0

我正在使用Flask WTForm,并尝试使用form.data从flask flask WTForm中获取数据,但返回的字段之一是csrf_token

我的文件结构如下

代码语言:javascript
复制
$ tree .
.
└── testing_app
    ├── __init__.py
    ├── forms.py
    ├── templates
    │   ├── index.html
    │   └── submit.html
    └── views.py

forms.py

代码语言:javascript
复制
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired

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

views.py

代码语言:javascript
复制
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

代码语言:javascript
复制
<html>
    this is index page
</html>

submit.html

代码语言:javascript
复制
<form method="POST" action="/submit">
    {{ form.csrf_token }}
    {{ form.name.label }} {{ form.name(size=20) }}
    <input type="submit" value="Go">
</form>

我用下面的代码运行它

代码语言:javascript
复制
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并单击名称为testok时,它将重定向到http://127.0.0.1:5000/,并将数据记录为

代码语言:javascript
复制
--------------------------------------------------------------------------------
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 -

有没有办法在不使用csrf_token的情况下获得data

我知道,我可以访问form.name,但在我必须尝试的地方,它有15字段,我尽量避免对每个字段都这样做。

我也可以这样做

代码语言:javascript
复制
for key, value in form.data.items():
    if key == 'csrf_token`:
        continue
    # process with other data

但是如果我们在Form中添加SubmitFieldform.data也会返回它。

我正在寻找烧瓶的方式,从表单中只获得stringselection字段。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-26 17:34:24

form对象有一个_fields属性,该属性包含表单中的所有字段。如果您遍历此字段,您将可以访问字段名称、数据和类型,并且您可以构建自己的数据字典,其中只包含您想要的字段类型。下面的方法应该是可行的。

代码语言:javascript
复制
data = {field.name: field.data for field in form._fields.values() if type(field) in (StringField, SelectField)}
票数 1
EN

Stack Overflow用户

发布于 2018-10-26 05:56:57

如果数据在Flask-WTF中有效,则可以访问所有数据

代码语言:javascript
复制
form.name_of_input_field.data

在您的示例中,这是:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52997336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档