파비의 매일매일 공부기록

Two Scoops of Django - #11장 본문

Study/Python

Two Scoops of Django - #11장

fabichoi 2021. 6. 12. 23:30

이번장은 장고 폼의 기초에 대한 내용이다.

장고에서 외부에서 입력된 데이터가 어떻게 폼으로 처리되는지를 이해한다면 깔끔하게 정리해서 사용할 수 있는 이점이 생길 것이다.

또한 데이터 처리를 하다 보면 까다로운 경우가 생기는데 이를 극복하는데도 도움이 될 것이다.

기억할만한 가장 중요한 점은 어떤 데이터든 입력 데이터라고 한다면 폼을 이용하여 유효성 검사를 해야 한다는 것이다.

 

1. 장고 폼을 이용하여 모든 입력 데이터에 대한 유효성 검사하기 : 장고 폼은 파이썬 딕셔너리의 유효성을 검사하는 데 최상의 도구다. 대부분의 경우 POST가 포함된 HTTP 요청을 받아 유효성을 검사하는 데 이용한다. 그 외에도 쓸 수 있긴 하다. 입력되는 데이터에 대해 일일이 유효성 검사 코드를 직접 만들지 않고 장고에서 제공하는 검증된 데이터 테스트 프레임워크를 활용하라.

 

2. HTML 폼에서 POST 메서드 이용하기 : 데이터를 변경하는 모든 HTML 폼은 POST 메서드를 이용하여 데이터를 전송하도록 구성하라

 

3. 데이터를 변경하는 HTTP 폼은 언제나 CSRF 보안을 이용해야 함 : 장고에는 CSRF(cross-site request forgery protection)이 내장되어 있다. 이용하기 간편할뿐더러 개발 단계에서 잊어버리고 이용하지 않을 경우 안내 메시지를 보여주기도 한다. CSRF 보안을 사용하지 않으면 치명적인 보안 문제를 만들 수 있으므로 꼭 활용하라고 충고한다. 보통 CSRF를 잠깐 사용하지 않아도 되는 경우는 머신들 사이에서만 이용되는 API 사이트를 제작할 때다. 그 외에는 CSRF를 사용하라.

 

4. 장고의 폼 인스턴스 속성을 추가하는 방법 이해하기 : 때때로 장고 폼의 clean(), clean_FOO(), save() 메서드에 추가로 폼 인스턴스 속성이 필요할 때가 있는데, 그때는 request.user 객체를 이용하면 된다.

 

5. 폼이 유효성을 검사하는 방법 알아두기 : 장고 내부에서의 처리 절차를 이해함으로써 코드 품질을 옮길 수 있는 분야가 폼의 유효성 검사다. form.is_valid()가 호출될 때 다음과 같은 순서로 진행한다.

  i. 폼이 데이터를 받으면 form.is_valid()는 form.full_clean() 메서드를 호출

  ii. form.full_clean()은 폼 필드들과 각각의 필드 유효성을 하나 검사하면서 다음과 같은 과정을 수행한다.

   - 필드에 들어오는 데이터에 대해 to_python()을 이용하여 파이썬 형식으로 변환하거나 만약 문제가 생기면 ValidationError를 일으킴

   - validator를 포함한 각 필드에 특별한 유효성을 검사. 문제가 있을 시 ValidationError를 일으킴

   - 폼에 clean_<field>() 메서드가 있으면 이를 실행

  iii. form.full_clean()이 form.clean()을 실행

  iv. ModelForm 인스턴스의 경우 form.post_clean() 이다음 작업을 함.

   - form_is_valid()가 True/False 상관없이 Model Form의 데이터를 모델 인스턴스로 설정

   - 모델의 clean() 메서드를 호출. 참고로 ORM을 통해 모델 인스턴스를 저장하는 때는 모델의 clean() 메서드가 호출되지 않음.

 

6. Form.add_error()를 이용하여 폼에 이러 추가 : Form.clean을 간소화 가능

 

7. 기존에 만들어진 위젯이 없는 필드의 경우에도 해당 필드들을 여전히 폼에 이용할 수 있음.

반응형

'Study > Python' 카테고리의 다른 글

Two Scoops of Django - #13장  (0) 2021.06.14
Two Scoops of Django - #12장  (0) 2021.06.13
Two Scoops of Django - #10장  (0) 2021.06.11
Two Scoops of Django - #9장  (0) 2021.06.10
Two Scoops of Django - #8장  (0) 2021.06.09
Comments