해당 글은 공부를 하기위해 작성이 되었고, 아래 글을 번역한 것임을 알려드립니다.
https://www.cnblogs.com/cwp-bg/p/9714741.html
flask_wtf
는 플라스크 프레임 워크의 폼 검증 모듈로, 쉽게 폼을 생성 할 수 있으며, json
데이터 상호 작용을 위한 검증 도구로도 사용할 수 있다.
pip install Flask-WTF
을 통해 설치.
# forms.py
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired
class MyForm(FlaskForm):
name = StringField('name', validators=[DataRequired()])
# app.py
from flask import Flask, current_app, request, render_template
from forms import MyForm
app = Flask(__name__,template_folder='static/html')
@app.route('/',methods=['GET','POST'])
def login():
form = MyForm()
if form.validate_on_submit():
return 'OK'
return render_template('forms/index.html', form=form)
if __name__ == '__main__':
app.run(host='127.0.0.1', port=80, debug=True)
# forms/index.html
<form method="POST" action="/">
{{ form.csrf_token }}
{{ form.name.label }} {{ form.name(size=20) }}
<input type="submit" value="Go">
</form>
flask_wtf
는 wtforms 구성 요소의 필드 모델을 완전히 사용한다.
wtform으로 정의 된 필드는 fields 모듈에 있으며 core와 simple로 구분된다.
core 모듈은 일반적으로 사용 되는 필드를 정의하고, simple은 코어 모듈을 기반으로 일부 필드를 확장한다.
# core.py
__all__ = (
'BooleanField', 'DecimalField', 'DateField', 'DateTimeField', 'FieldList',
'FloatField', 'FormField', 'IntegerField', 'RadioField', 'SelectField',
'SelectMultipleField', 'StringField',
)
BooleanField : True or False
StringField : 문자열
DecimalField : 소수점 텍스트 필드 ex)‘1.23’
DateField : 날짜 필드,형식:'%Y-%m-%d'
DateTimeField: 날짜 필드,형식:'%Y-%m-%d %H:%M:%S'
FloatField : 부동소수점 유형
IntegerField : 정수
SelectMultipleField:체크박스
RadioField : 라디오박스
# simple.py
TextAreaField : 텍스트 필드(여러줄 입력)
PasswordField : 패스워드(보여지지 않음)
FileField :파일을 업로드(파일 확인은 하지 않으며, 확인은 수동으로 처리해야함)
HiddenField:숨겨진 필드
SubmitField:제출 필드
__all__ = (
'DataRequired', 'data_required', 'Email', 'email', 'EqualTo', 'equal_to',
'IPAddress', 'ip_address', 'InputRequired', 'input_required', 'Length',
'length', 'NumberRange', 'number_range', 'Optional', 'optional',
'Required', 'required', 'Regexp', 'regexp', 'URL', 'url', 'AnyOf',
'any_of', 'NoneOf', 'none_of', 'MacAddress', 'mac_address', 'UUID'
)
모듈에는 data_required에 해당하는 DataRequired와 같이 대문자와 소문자에 해당하는 모드가 있습니다.
DataRequired/data_required :데이터가 실제로 존재하는지, 즉 비어있을 수 없는지, 공백이 아닌 문자열이어야하는지 확인. 그렇지 않으면 StopValidation 오류가 트리거가된다.
InputRequired/input_required :DataRequired와의 차이점은 빈 문자열 일 수 있다는 것.
Required/required :data_required의 별칭
Email/email :가장 기본적인 이메일 형식
EqualTo/equal_to :비밀번호와 비밀번호 확인과 같은 두 필드의 값을 비교. 두 필드가 같지 않으면 오류 발생. equal_to (field, message), 다른 필드의 이름을 입력해야함.
IPAddress/ip_address :IP 주소인지 확인(기본적으로 IPV4 주소가 확인됨)
MacAddress/mac_address :Mac 형식을 준수하는지 확인
UUID:uuid 형식인지 여부.
URL/url :URL 형식을 준수하는지 확인
Regexp/regexp :제공된 정규식을 사용하여 필드 유효성 검사, Regexp (r "")
Length/length :필드 값의 길이를 설정, Length (min, max);
NumberRange/number_range :숫자 필드의 값 범위를 설정(부동 소수점 숫자 및 소수일 수도 있음) NumberRange(min, max)
Optional/optional :
NoneOf/none_of :
Anyof/any_of :
validator 를 자세히 보고 싶다면 아래 링크 참조
https://flask-validator.readthedocs.io/en/latest/validators.html
flask_wtf
는 Form에 필요한 모든 속성과 메서드를 제공하는 Form 객체의 하위 클래스 FlaskForm을 사용할 것을 권장한다.
그렇다면 Form 객체는 어떻게 자동으로 양식 기능을 실현할까?
class FlaskForm(Form):
class Meta(DefaultMeta):
def wrap_formdata(self, form, formdata):
pass
def __init__(self, formdata=_Auto, **kwargs):
csrf_enabled = kwargs.pop('csrf_enabled', None)
pass
def is_submitted(self):
pass
def validate_on_submit(self):
pass
def hidden_tag(self, *fields):
pass
def validate(self):
pass
FlaskForm
은 내부에 Meta 클래스를 정의하여 csrf로 보호되는 일부 메서드를 추가하므로 양식을 만들 때 Form 대신 FlaskForm을 가져와야한다.is_submitted
: 활성 요청 요청이 있는지 확인한다.validate_on_submit
: is_submitted 및 validate 메소드를 호출하고 bool 값을 반환하여 양식이 제출되었는지 여부를 확인한다.validate
: 필드 수준 유효성 검사. 각 필드에는 유효성 검사 메서드가 있다. FlaskForm은 모든 필드에 대한 유효성 검사 메서드를 호출하기 위해 validate를 호출한다. 모든 유효성 검사가 통과되면 True를 반환하고 그렇지 않으면 예외가 발생한다.hidden_tag
: 양식의 숨겨진 필드를 가져온다.wrap_formdata
: 요청에서 양식 가져오기, 이 함수는 요청에서 양식을 가져 오기 위해 양식 객체가 초기화 될 때마다 실행된다.form.data :필드 이름과 값의 사전
form.errors :유효성 검사에 실패한 정보 사전(validate_on_submit 메서드를 호출 한 후 유효)
form.name.data:필드 이름의 값
form.name.type:필드 이름 유형
flask_wtf 의 FlaskForm 으로 만들었다면,
FlaskForm
은 요청 객체에서 request.form
및 request.get_json()
메서드를 자동으로 호출하여 데이터를 수신한다.
flask_wtf의 FlaskForm 을 만들었다면 자동으로 csrf 보호가 활성화 되어있다.
그렇기 때문에 html 안에는 {{form.csrf_token}}
을 추가해야 합니다.
csrf_token 를 비활성화 하기 위해서는 아래와 같은 방법을 사용하면 됩니다.
# form을 받을 때 비활성화
form = Form(csrf_enabled=False)
# config.py 안에 아래와 같은 코드 삽입
WTF_CSRF_ENABLED = False