남기면 좋잖아
7. 장고 Forms 본문
반응형
DRF-React Study
Chapter 5. 장고 Forms
HTML Form
- 언제 쓰는가
- HTML Form(클라이언트 측)
- 클라이언트에서 입력폼을 제공하고 이를 서버로 전송하고자 할때
- Djnago Form(서버 측)
- 받은 값의 유효성 검사 수행 / 데이터베이스에 저장하는 등의 처리 (POST요청)
- HTML Form을 생성하는 기능(GET 요청)
- HTML Form(클라이언트 측)
- HTML Form
- form 태그를 통해 입력폼 구성
- submit 시에 지정 action URL로 데이터 전송 시도
- Form 태그 필수 속성
- action : 요청을 보낼 주소
- method : 전송 방식
- GET, POST
- enctype : 인코딩 방식
- POST 요청에만 유효
- GET 요청에서는 하나의 방식만 강제됨
- form의 enctype
- "apllication/x-www-form-urlencoded" (디폴트)
- GET 요청에서는 이 유형이 강제됨
- 인자들은 URL 인코딩을 수행하여 쿼리스트링 형태로 전달
- 파일 업로드 불가
- "multipart/form-data"
- 파일 업로드 가능
- "apllication/x-www-form-urlencoded" (디폴트)
- url encode
- 키, 값 쌍이 & 문자로 이어진 형태
- 공백은 +, 스페셜 문자들은 ascii 16진수 문자열/UTF8 인코딩 16진수 문자열로 변환
- Form 요청에서 인자 보내는 2가지방법
- 요청 URL 뒤에 ? 를 붙이고 인자 실어보내기 (쿼리스트링)
- 주로 GET 요청에서 사용
- POST 요청에도 가능
- Body에 모든 인코딩의 인자를 실어 보냄
- 파일 업로드 가능
- GET
- 헤더만 존재
- POST
- 바디 영역까지 존재
- 헤더와 바디 사이 공백한줄로 구분
- 요청 URL 뒤에 ? 를 붙이고 인자 실어보내기 (쿼리스트링)
- GET 요청 예시
- 주로 검색폼에서 인자를 넘길때 쓰임.
- 조회 목적
- Django View 에서 인자 접근
- request.GET
- 모든 쿼리스트링 인자 목록
- 쿼리스트링을 파싱한 QueryDict 객체
- GET/POST 요청에서 모두 가능
- 모든 쿼리스트링 인자 목록
- request.POST
- POST 요청에서만 가능
- 파일 내역은 제외한 모든 POST인자 목록
- 요청 BODY를 파싱한 QueryDict 객체
- request.FILES
- POST 요청에서만 가능
- 요청 BODY에서 파일내역만 파싱한 MultiValueDict 객체
- request.GET
HttpRequest와 HttpResopnse
- HttpRequest 객체
- 클라이언트로부터의 모든 요청 내용을 담고 있음
- FBV : 뷰 함수의 첫번째 인자 request로 전달
- CBV : self.request를 통해 접근
- Form 처리 관련 속성
- .method : 요청의 종류로서 모두 대문자
- .GET
- .POST
- .FILES
- 클라이언트로부터의 모든 요청 내용을 담고 있음
- QueryDict(MultiValueDict)
- 같은 키에 여러 값
- 수정 불가능한 특성
- 예) http 에선 같은 photo 값에 여러 사진이 들어갈수 있음
- MultiValueDict(dict)
- dict을 상속받은 클래스
- 동일 key의 다수 value를 지원하는 사전
- HttpResponse
- 다양한 응답을 Wrapping : HTML 문자열, 이미지 등등
- 파일-like 객체
- 사전-like 인터페이스로 응답의 커스텀 헤더 추가/삭제
- JsonResponse
- StreamingHttpResponse
- 효율적인 큰 응답을 위함
- 혹은 메모리를 많이 먹는 응답 -> iterator를 통한 응답
- 하지만 Django는 short-lived 요청에 맞게 디자인
- Http Response를 상속받지 않음
- 필히 iterator를 지정해야만 제대로 동작
- .streaming_content 사용
- 효율적인 큰 응답을 위함
- FileResponse
- StreamingHttpResponse 상속받음
Form
- Form
- 입력폼 HTML 생성
- 유효성 검증 및 값 변환
- 검증 통과한 값들을 dict형태로 제공
- 모델폼
- 필드 별로 유효성 검사 함수 추가 적용 가능
- 모델에서 유효성검사를 적용해 놓으면 추후 모델폼에서 해당 유효성 검사를 적용함
- 모델을 풍성하게 만들자
Cross Site Request Forgery
- 사이트 간 요청 위조 공격
- 사용자가 의도하지 않게 게시판에 글을 작성하거나, 쇼핑을 하게 하는 등의 공격
- 특정 웹사이트가 유저의 웹브라우저를 신용하는 상태를 노린것
- 공격자 사이트에 접속만해도 자동으로 POST 전송
- 공격을 막기 위해 Token을 통한 체크
- POST 요청에 한해 CsrfViewMiddleware를 통한 체크
- post 요청 받을때 Token값이 없거나 유효하지 않다면 403에러
- 처리 순서
- form을 보여줄때, CSRF Token 값도 값이 할당
- CSRF TOken은 USER마다 다르며, 계속 변경
- 그 입력 Form을 통해 Token값이 전달 되면 Token 유효성 검증
- form을 보여줄때, CSRF Token 값도 값이 할당
- POST 요청에 한해 CsrfViewMiddleware를 통한 체크
- CSRF Token 체크를 해제 하려면
- view에서 @csrf_exempt 장식자 활용
- 앱 API에서는 끄자
- DRF에서는 APIView에서 csrf_exempt가 적용되어 있음
- 별도의 유저인증 토큰을 사용하기 때문에
ModelForm
- ModelForm
- 장고 Form을 상속
- 내부적으로 Model Instance를 유지
- ModelForm.save(commit=True)
- Form의 cleand_data를 Model Instance 생성에 사용하고 그 Instance를 리턴
- commit을 False를 할 경우 실제 데이터는 생성되지 않음
- instance.save() 호출을 지연시키고 싶을때 사용
- commit=False 예시
- 작성자 같은 경우 request.user를 지정하면 되기 때문에 False 후 따로 유저 저장 뒤에 save
- Form을 끝까지 쓰자
- form.cleaned_data['message'] 와 같이 유효성이 통과된 값을 사용
- request.POST['message'] 와 같은 데이터는 쓰지말자
Form Validation
- 유효성 검사가 수행되는 시점
- is_valid() 함수가 호출되었을때
- 유효성 검사 호출 로직
- form.full_clean() 호출
- 각 필드 객체 별로
- 각 필드객체.clean() 호출을 통해 각 필드 type에 맞춰 유효성 검사
- Form 객체 내에서
- 필드 이름 별로 Form객체.clean_필드명() 함수가 있다면 호출해서 유효성 검사
- Form객체.clean() 함수가 있다면 호출해서 유효성 검사
- DRF 에서는 clean 대신 validate라는 이름을 사용
- 각 필드 객체 별로
- 에러 유무에 따른 True/False 리턴
- form.full_clean() 호출
- 2가지 유효성 검사
- validator 함수를 통한 유효성 검사
- 값이 맞지 않으면, ValidationError 예외 발생
- Form 클래스 내 clean, clean_멤버함수를 통한 검사
- 값이 맞지 않으면, ValidationError 예외 발생
- 리턴값을 통해 값 반환
- validator 함수를 통한 유효성 검사
- 함수형/클래스형 Validator
- 함수형
- 클래스형
- Form clean 멤버함수에게 기대하는 것
- 필드별 Error 기록 혹은 Non 필드 Error 기록
- ValidationError 기록
- add_error 기록
- 원하는 포맷으로 값 변경
- 필드별 Error 기록 혹은 Non 필드 Error 기록
- 용도
- validators
- 가급적이면 모든 validators는 모델에 정의
- clean
- 특정 form에서 1회성 유효성 검사 루틴이 필요할때
- 다수 필드값에 걸쳐서 유효성 검사가 필요할때
- 필드 값을 변경할 필요가 있을때
- validators
반응형
'Programming > Django' 카테고리의 다른 글
8. 장고 기본 인증 구현 (0) | 2020.07.17 |
---|---|
7. 장고 Forms(2) (0) | 2020.07.17 |
6. 웹 프론트엔드 기초 및 장고 static (0) | 2020.07.16 |
5. 장고 Views(2) (0) | 2020.06.29 |
5. 장고 Views (2) | 2020.06.20 |
Comments