验证前修改请求

时间:2015-01-11 13:22:11

标签: python validation flask wtforms

我有一份注册表格:

class AddUserForm(Form):
    email = StringField(_('Email'), [validators.DataRequired()])
    password = PasswordField('Password', [validators.DataRequired()])
    forename = StringField('Forename', [validators.DataRequired()])
    surname = StringField('Surname', [validators.DataRequired()])
    address = TextAreaField('Address', [validators.DataRequired()])
    join_date = DateField('Join Date', [validators.DataRequired()])

并查看如下:

@app.route('user/add/', methods=['GET', 'POST'])
def add():
    #  here I need to modify request.form
    form = AddUserForm(request.form)
    if request.method == 'POST' and form.validate():
        user = User(email=request.form['email'])
        form.populate_obj(user)
        user.set_password(request.form['password'])
        db.session.add(user)
        db.session.commit()
        return jsonify({'message': 'thanks for registration',
                        'status': 'success'})
    return render_template('user/form.html', form=form)

问题是当我尝试验证此表单时。

form.validate()返回false并带有request.form ['join_date']值,所以我必须先将日期字段转换为格里高利日期。

我想如果在将其传递给addUserForm()之前无论如何都可以修改request.form,那么我的form.validate()就不会返回false。

但我不能,因为它是一个ImmutableMultiDict。 我想知道是否可以复制request.form,它不是Immutable或任何其他方式来在验证之前修改请求。

1 个答案:

答案 0 :(得分:1)

我发现我不必修改request.form。我可以修改我将request.form传递给它的表单。

from jdatetime import datetime

def add():
    form = AddUserForm(request.form)
    # can modify the form with form.<NAME>.data
    form.phone.data = datetime.strptime(request.form['join_date'], '%Y/%m/%d').date().togregorian()
    # and validate it then
    if request.method == 'POST' and form.validate():
        # do stuff