Flask WTFormsはvalidate_on_submit()で常にfalseを返します

Rahul Shelke

wtformsを使用してサインアップフォームを作成しました。フォームの要素の一部を再度繰り返す必要がないように、FormFieldを使用しています。ただし、[送信]ボタンをクリックすると、validate_on_submitメソッドの呼び出しで常にfalseが表示されます。なぜこれが起こっているのかわからない。

form.pyは次のとおりです。

class ProfileInfoForm(Form):
    firstname = TextField('firstname', validators=
                          [validators.Required("Please enter First name.")])
    lastname = TextField('lastname', validators=
                         [validators.Required("Please enter Last name.")])
    email = EmailField('email', validators=
                       [validators.Required("Please enter your valid email.")])
    gender = RadioField('gender', validators=
                        [validators.Required("Please select gender")],
                        choices=[('female', 'Female'), ('male', 'Male')])
    dob = TextField('dob', validators=
                    [validators.Required("Please select date of birth.")])
    languages = SelectMultipleField('languages', choices=[('', '')],
                                    validators=
                                    [validators.Required("Please select\
                                                         atleast one \
                                                         language.")])


class RegistrationForm(Form):
    profilefield = FormField(ProfileInfoForm)
    password = PasswordField('password',
                             validators=
                             [validators.Required("Please enter password."),
                              validators.Length(min=8),
                              validators.EqualTo('confirm_password',
                                                 message='Password and confirm\
                                                 password must match')])
    confirm_password = PasswordField('confirm_password',
                                     validators=
                                     [validators.Required("Please enter\
                                                          confirm password.")])
    tnc = BooleanField('tnc', validators=
                       [validators.Required("Please select Terms and \
                                            Conditions")], default=False)

    submit = SubmitField('Create My Account')

Signup 方法は次のとおりです。

@module.route('/signup', methods=['GET', 'POST'])
  @handle_error
  def signup():
      if hasattr(g, 'user') and g.user:
          # TODO: do some operations if needed else keep it blank
          return redirect(url_for('index'))
      else:
          signup_form = RegistrationForm()
          # Add choices for the user
          signup_form.profilefield.languages.choices = getLanguages()
          if signup_form.validate_on_submit():
              firstname = signup_form.profilefield.firstname.data
              lastname = signup_form.profilefield.lastname.data
              email = signup_form.profilefield.email.data
              password = signup_form.password.data
              #  confirm_password = signup_form.confirm_password.data
              gender = signup_form.profilefield.gender.data
              dob = signup_form.profilefield.dob.data
              languages = signup_form.profilefield.languages.data
              tnc = signup_form.tnc.data

              payload = {'firstname': firstname, 'lastname': lastname,
                         'email': email, 'password': password, 'gender': gender,
                         'dob': dob, 'languages': languages,
                         'tnc': ('1' if tnc else '0')}
              try:
                  buildApiUrl = BuildApiUrl()
                  response = requests.post(buildApiUrl.getUrl("user", "signup"),
                                           data=payload)

                  if response.status_code == requests.codes.ok:
                      data = json.loads(response.text)
                      if 'status' in data and data['status'] != 200:
                          flash(data['message'], category="error")
                      else:
                          flash(data['message'] +
                                ': Your account is created successfully! ' +
                                'Please login to your account!',
                                category="success")
                          return redirect(url_for('index'))
              except requests.exceptions.RequestException:
                  flash('Internal Server side error occured', category="error")
                  return redirect(url_for('server_error', e='500'))

      return render_template('public/index.html',
                             signup_form=signup_form, login_form=LoginForm())

HTMLフォームはここの要点にあります

参考:必要なすべてのフィールドに、実際に必要なデータを入力しています。validate_on_submit()を呼び出すと、まだfalseになります。私のコードの何が問題になっていますか?

編集:getLanguagesは、データベースから言語を取得して選択リストに入れるメソッドです。この機能は期待どおりに行われており、言語のリストを取得できます。

編集2:ここで1つのことを実現します。これはFormFieldが原因で発生しています。これは、ProfileInfoForm()のすべてのフィールドをRegistrationForm()メソッドに追加してテストしたところ、すべてが正常に機能し、サインアップできたためです。そのため、FormFieldまたはその使用方法に問題がありますが、どこで問題が発生しているかはわかりません。

問題はFormFieldではなく、私のProfileInfoForm()にあることがわかりました。常にfalseを返します。まだ理由はわかりませんが、そのことについては自分で検証を書かなければならないかもしれません。何かご意見は?

編集:

ダンプで私は次のようになりました(ここでpprintを使用しました):

{'SECRET_KEY': '1e4c35233e50840483467e8d6cfe556c',
 '_errors': None,
 '_fields': {'csrf_token': <wtforms.ext.csrf.fields.CSRFTokenField object at 0x2207290>,
             'dob': <wtforms.fields.simple.TextField object at 0x2207650>,
             'email': <flask_wtf.html5.EmailField object at 0x22074d0>,
             'firstname': <wtforms.fields.simple.TextField object at 0x2207350>,
             'gender': <wtforms.fields.core.RadioField object at 0x2207590>,
             'languages': <wtforms.fields.core.SelectMultipleField object at 0x2207710>,
             'lastname': <wtforms.fields.simple.TextField object at 0x2207410>},
 '_prefix': u'profilefield-',
 'csrf_enabled': True,
 'csrf_token': <wtforms.ext.csrf.fields.CSRFTokenField object at 0x2207290>,
 'dob': <wtforms.fields.simple.TextField object at 0x2207650>,
 'email': <flask_wtf.html5.EmailField object at 0x22074d0>,
 'firstname': <wtforms.fields.simple.TextField object at 0x2207350>,
 'gender': <wtforms.fields.core.RadioField object at 0x2207590>,
 'languages': <wtforms.fields.core.SelectMultipleField object at 0x2207710>,
 'lastname': <wtforms.fields.simple.TextField object at 0x2207410>}

編集:

少し掘り下げてみると、エラーが生成されるのはcsrfトークンがないことが原因であることがわかりました。しかし、私は{{ signup_form.hidden_tag() }}htmlのフォームテンプレートに含めました。また、要素を検査すると生成されたhtmlに非表示のタグが表示され、ハッシュ値を含むcsrf_tokenフィールドが表示されます。では、ここで何が問題になっていますか?

Rahul Shelke

次の関数で問題を解決しました。

def __init__(self, *args, **kwargs):
    kwargs['csrf_enabled'] = False
    super(ProfileInfoForm, self).__init__(*args, **kwargs)

この関数をに追加しました ProfileInfoForm()

問題はFormFieldcsrf_tokenフィールドと実際のフォーム含まれていることRegistrationFormでした。つまり、csrf_tokenも含まれcsrf_tokenていたため、検証する必要があるのは2つで、実際にフォームにレンダリングされるのは1つだけでした。それで、FormFieldがそれをレンダリングcsrf_tokenProfileInfoFormたとき、私それを無効にしましcsrf_token = False

そして、RegistrationFormしているんcsrf_tokenフォームがまだ安全であるように、今も有効。

私の推測では、これもFormField同様に行う必要があります。

参考:FormFieldコードの解釈が原因で、このソリューションは間違っている可能性があります。したがって、上記の解決策が間違っている場合は、訂正してください。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Flask check_passwordは常にfalseを返します

分類Dev

Flask-WTForms form.validate()は動的な選択で失敗します

分類Dev

Flask WTForms FieldList with BooleanField

分類Dev

フラスコvalidate_on_submitは常にFalse

分類Dev

FlaskのWTFormsでDecimalRangeFieldを検証する

分類Dev

Flask-WTF-validate_on_submit()は決して実行されません

分類Dev

Flask、WTForms:StringFieldを_一時的に_非表示にする方法はありますか?

分類Dev

Flask-WTFormsのrender_kwでFlask-Babelgettextを使用する方法は?

分類Dev

Flask-WTF / WTFormsを使用してFlaskにキャンセルボタンを追加します

分類Dev

FLASK RESTAPIはPOSTで400を返します

分類Dev

FILTER_VALIDATE_INTは常にfalseを返します

分類Dev

Flaskとflask-restulを使用してJSONをAPI呼び出しに返し、HTMLをブラウザーに返すことはできますか?

分類Dev

Flask、wtformsは空のフォームをポストバックします

分類Dev

if(isset($ _ POST ['submit']))は常にfalseを返します

分類Dev

FlaskとFlask-WTFormsを使用してフォームをループしている間、csrfラベルを非表示にする方法はありますか?

分類Dev

編集フォームにWTFormsとFlaskを事前入力します

分類Dev

Flask_wtf-ページ読み込み時のvalidate_on_submit()エラー

分類Dev

Flask / WTFormsで繰り返しサブフォームの数を変えてフォームを作成する

分類Dev

Flask request.get_json()はjsonではなく文字列を返します

分類Dev

Python Flask WTForms:「無効な選択」を返す動的SelectField

分類Dev

validate_on_submit()ブロックの後にWTForms FieldListを設定するにはどうすればよいですか?

分類Dev

Python Flask WTForms FloatFieldは1,0を許可し、1.0はコンマとドットを許可します

分類Dev

Flask-Restplusと一緒に使用すると、/でのフラスコルートは404を返します

分類Dev

Flask-logincurrent_userはIDのみを返します

分類Dev

Flaskは複数の変数を返しますか?

分類Dev

FlaskのSQLSELECTAVGは2D配列を返します

分類Dev

Flask静的ファイルは500エラーを返します

分類Dev

Flask / WTForms-フォームをインラインにするにはどうすればよいですか?

分類Dev

Flaskで正の値のみを返します

Related 関連記事

  1. 1

    Flask check_passwordは常にfalseを返します

  2. 2

    Flask-WTForms form.validate()は動的な選択で失敗します

  3. 3

    Flask WTForms FieldList with BooleanField

  4. 4

    フラスコvalidate_on_submitは常にFalse

  5. 5

    FlaskのWTFormsでDecimalRangeFieldを検証する

  6. 6

    Flask-WTF-validate_on_submit()は決して実行されません

  7. 7

    Flask、WTForms:StringFieldを_一時的に_非表示にする方法はありますか?

  8. 8

    Flask-WTFormsのrender_kwでFlask-Babelgettextを使用する方法は?

  9. 9

    Flask-WTF / WTFormsを使用してFlaskにキャンセルボタンを追加します

  10. 10

    FLASK RESTAPIはPOSTで400を返します

  11. 11

    FILTER_VALIDATE_INTは常にfalseを返します

  12. 12

    Flaskとflask-restulを使用してJSONをAPI呼び出しに返し、HTMLをブラウザーに返すことはできますか?

  13. 13

    Flask、wtformsは空のフォームをポストバックします

  14. 14

    if(isset($ _ POST ['submit']))は常にfalseを返します

  15. 15

    FlaskとFlask-WTFormsを使用してフォームをループしている間、csrfラベルを非表示にする方法はありますか?

  16. 16

    編集フォームにWTFormsとFlaskを事前入力します

  17. 17

    Flask_wtf-ページ読み込み時のvalidate_on_submit()エラー

  18. 18

    Flask / WTFormsで繰り返しサブフォームの数を変えてフォームを作成する

  19. 19

    Flask request.get_json()はjsonではなく文字列を返します

  20. 20

    Python Flask WTForms:「無効な選択」を返す動的SelectField

  21. 21

    validate_on_submit()ブロックの後にWTForms FieldListを設定するにはどうすればよいですか?

  22. 22

    Python Flask WTForms FloatFieldは1,0を許可し、1.0はコンマとドットを許可します

  23. 23

    Flask-Restplusと一緒に使用すると、/でのフラスコルートは404を返します

  24. 24

    Flask-logincurrent_userはIDのみを返します

  25. 25

    Flaskは複数の変数を返しますか?

  26. 26

    FlaskのSQLSELECTAVGは2D配列を返します

  27. 27

    Flask静的ファイルは500エラーを返します

  28. 28

    Flask / WTForms-フォームをインラインにするにはどうすればよいですか?

  29. 29

    Flaskで正の値のみを返します

ホットタグ

アーカイブ