[Flask] Flask_WTF

최더디·2020년 9월 7일
0

해당 글은 공부를 하기위해 작성이 되었고, 아래 글을 번역한 것임을 알려드립니다.
https://www.cnblogs.com/cwp-bg/p/9714741.html


Flask_WTF


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 필드 정의


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:제출 필드

  • 필드 유효성 검사 순서
    필드 매개 변수 유효성 검사기는 양식을 제출하기 위한 유효성 검사 순서를 왼쪽에서 오른쪽 순서로 지정할 수 있으며, 기본 선택적 유효성 검사는 wtforms.validators 모듈에 있으며 캡슐화 된 유효성 검사 방법은 다음과 같습니다.
__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:필드 이름 유형

form = Form()


flask_wtf 의 FlaskForm 으로 만들었다면,

FlaskForm은 요청 객체에서 request.formrequest.get_json() 메서드를 자동으로 호출하여 데이터를 수신한다.

csrf_token


flask_wtf의 FlaskForm 을 만들었다면 자동으로 csrf 보호가 활성화 되어있다.
그렇기 때문에 html 안에는 {{form.csrf_token}} 을 추가해야 합니다.
csrf_token 를 비활성화 하기 위해서는 아래와 같은 방법을 사용하면 됩니다.

# form을 받을 때 비활성화
form = Form(csrf_enabled=False)

# config.py 안에 아래와 같은 코드 삽입
WTF_CSRF_ENABLED = False
profile
focus on why

0개의 댓글