洪民憙 (홍민희) 블로그

이하의 글은 2011년에 쓴 것입니다. 오래된 글인 만큼, 현재의 생각과 전혀 다른 내용도 많이 포함되어 있고, 당시와는 상황이 많이 달라진 점도 있습니다. 또한, 그 당시에 잘못 알려졌던 정보도 포함되어 있을 수 있습니다. 어찌됐든 저는 제 오래된 글이 회자되는 것을 저어합니다. 읽기에 앞서 양해를 부탁드립니다.

WTForms는 입력 폼을 만들어주는 라이브러리이다. 폼을 선언적인 스타일로 정의하면 HTML도 만들어주고 유효성 검사도 해주는 식이다. 이걸 써서 회원 정보 수정 양식을 만들었는데, 일부 사용자가 이메일 필드에 ' [email protected] '과 같이 끝에 공백을 실수로 입력하는 일이 일어났다. 입력 받은 문자열을 trim하는 방법을 찾아봤지만 현재로서는 그런 옵션이 없는 것 같다. 그래서 필드 타입을 ad-hoc하게 확장하는 함수를 만들었다.

import wtforms.fields


def Trimming(field_cls):
    """Makes a subclass of the given ``field_cls``, must be a subtype
    of :class:`wtforms.field.Field`, that trims form data. ::

        TrimmingEmailField = Trimming(flaskext.wtf.html5.EmailField)

    :param field_cls: a field type to subclass
    :type field_cls: :class:`type`
    :returns: a new subclass that trims form data
    :rtype: :class:`type`

    """
    if not isinstance(field_cls, type):
        raise TypeError('field_cls must be a type, not instance')
    elif not issubclass(field_cls, wtforms.fields.Field):
        raise TypeError('field_cls must be a subtype of wtforms.fields.Field')
    class TrimmingField(field_cls):
        def process_formdata(self, valuelist):
            field_cls.process_formdata(self, [v.strip() for v in valuelist])
    if hasattr(field_cls, '__name__'):
        TrimmingField.__name__ = 'Trimming' + field_cls.__name__
    return TrimmingField