일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- dict
- pandas
- socket io
- NeXT
- wetube
- async
- 파이썬
- SAA
- RDS
- lambda
- flask
- 중급파이썬
- TypeScript
- node
- EC2
- 튜플
- SSA
- MongoDB
- AWS
- S3
- 채팅
- Vue
- git
- Props
- crud
- 카톡
- react
- Class
- merge
- docker
- Today
- Total
초보 개발자
django login form 1 본문
기본 골격
LogitnForm을 email과 password로 구성해주었다.
password는 charField이기 때문에 타이핑하는 문자가 그대로 노출이 된다. 따라서 widget을 사용하여 그 부분을 가려주었다.
LoginView를 CBV로 만들어 주었다. get과 post일 때를 구별해주었다.
form을 만들고 POST로 요청을 보낸다. 전에 GET으로 보낼 때는
{% csrf_token %}이라는 것을 사용하지 않았는데, 이번 POST요청 시에는 이걸 사용하지 않으면 요청이 불가능하도록 사전에 django가 막아준다.
아래가 csrf token이다.
간단히 설명해보자면
유저가 로그인을 하면 서버가 로그인을 했다는 정보를 유저의 브라우저에 넘겨주고 이걸 쿠키라는 곳에 담는다.
서버와 브라우저는 stateless 이기 때문에 한번 통신을 하고나면 서로를 까먹는다. 따라서 통신할 때 이 쿠키를 서버에 보여줌으로써 사용자의 정보(로그인 유무, 장바구니, .... )등을 서버가 알아차릴 수 있는 것이다.
만약 이 쿠키를 지우지 않고 다른 웹사이트에 갔다고 해보자. 그 웹사이트에서 악의적으로 유저의 쿠키를 사용하여 사용자의 정보를 탈취하거나 조작하는 것이 가능하다. 그걸 방지하기 위해서 무언가를 post로 요청할 시 crsf token을 같이 보내야만 하게 한 것이다. ( 내 웹사이트가 아닌 다른 웹사이트에서는 이 csrf token이 없기 때문)
LoginView에서
form안에 POST정보가 담겨 올 것이다. 이를 확인하는 작업을 해주어야 한다.
clean_
form에 clean_email 과 clean_password를 만들어 준 뒤 print를 시켜줘보자. 여기서 이름을 잘 보면 clean이 아니고 clea로 주었다. 이렇게 하는 이유는 clean_으로 시작하는 함수는 특별함이 있기 때문이다.
그리고 form이 valid한지를 보여주는 print문도 추가하여 html에서 정보를 보내보자.
그럼 콘솔창에 신기한일이 벌어진다. 우리는 clean_email메서드를 실행한 적이 없다. 하지만 자동으로 실행이 되어졌다.
반면 clea_pw는 호출되지 않았다. 이제 이름을 clean으로 제대로 고쳐주자
내가 만약 clean_method를 만들어줬고 내가 아무것도 return 하지 않으면 그 field를 지워버린다.
form.cleaned_data는 우리가 form에서 clean_method에서 값을 return하여 정리한 결과물들이 들어가 있다.
우리는 clean_method가 아직 값을 return 하지 않고 print만 해주고 있다. 따라서 위의 결과는 None값이 들어가 있을 것이다.
아래와 같이 수정한 뒤에 다시 post요청을 보내보자.
form.cleaned_data에는 위와 같은 값이 들어있다. 우리가 html에서 어떠한 값을 적든, 결국 clean_method의 return 값이 들어가는 강력한 힘을 가지고 있다.
신기한 점🔍
- 우리는 clean_method를 어디에서도 호출한 적이 없는데 form이 알아서 호출해주었다.
- clean_method의 return값이 view의 form.cleaned_data의 값으로 들어간다. ( html에서 전송받은 값 상관 X )
- clean_email이면 알아서 자동으로 email에 return값이 들어가고, clean_passwrod이면 알아서 password에 return값이 들어간다.
clean_email에서 self.clean_data를 사용하면 html에서 서버로 보낸 email값이 들어있다.
이를 활용하여 값이 우리가 원하는 조건에 해당하지 않으면 에러를 발생시키는 등의 일을 수행할 수 있다.
아이디 유무 확인
forms.py에서 확인절차를 거쳐준다.
self.cleaned_data에 담겨온 email을 받아와서 get으로 찾아준다. try except로 감싸준 이유는 get은 존재하지 않으면 error가 나버리기 때문이다. 만약 존재하면 email을 그대로 return 해주고 존재하지 않는다면
forms.ValidataionError를 발생시켜준다. 이렇게 해주면 오류가 발생한 경우 form.is_valid()가 False로 나온다.
그리고 오류를 가지고 있는 form은 html에서도 확인할 수 있다.
우리가 clean_email에서 error를 발생시키면 html에서 email에 error메시지가 보이고, 똑같이 clean_password에 발생시키면 password에서 오류메시지를 확인할 수 있다.
비밀번호 확인
비밀번호를 확인하기 위해서는 먼저 아이디가 있는지 확인하고 그 아이디의 비밀번호가 맞는지 체크해야한다.
비밀번호를 체크하는 것은 user.check_password를 사용하면 쉽게할 수 있다. 그리고 일치하면 password를 return하고 그렇지 않다면 error를 발생시켰다.
하지만 아이디의 유무를 확인하는 과정에서 clean_email과 같은 코드를 사용할 수 밖에 없었다.
이는 비효율적이다. 따라서 이 부분을 개선을 해보려고한다.
clean
두개의 서로다른 field가 관련이 있을 때 정보를 확인하는 method를 만드려고한다. 이는 clean method를 사용하면 된다.
각 각 따로 관리되었을 때, user가 없을 경우, password가 맞지 않을 경우에 raise로 에러를 발생시켰지만 clean으로 한번에 관리를 하게 된 경우에는 self.add_error로 하나씩 추가해주어야 한다. 이렇게 하지 않으면 password가 잘못되었다는 메시지가 password위에 뜨지 않고 전체 에러로 뜨기 때문이다.
만약 clean_password로 해주었다면 raise로 해줘도 상관 없다. 하지만 같이 관리하는 경우에는 raise말고 self.add_error를 사용해주어야한다.
그리고 clean메서드를 사용하였고 email과 password가 일치하다면 반드시 self.cleaned_data를 반환해주어야 한다.
우리는 view에서 정보를 받아오고 그 정보를 다시 form으로 넘겨 유효성을 확인한 뒤 다시 view로 정보를 보낸다.
form.is_valid()가 동작한 다는 뜻은 결국 email과 password가 일치하다는 뜻이고 view에서는 반환된 self.cleaned_data에서 email과 password를 unpacking해서 인증시킨 뒤, 로그인 시켜주면 된다.
django가 알아서 로그인시 쿠키정보를 넘겨주고 로그아웃시 이를 없애준다.
Clean Clean_ Method 정리🔍
Form에 아래와 같이 forms.~~Field로 적어둔 순서대로! html에 적혀진다.
만약 아래의 식과 같이 적어두면 clean_email이 아래에 적혀 있어도, Field상으로 일찍 적혀있기 때문에 먼저 실행이 된다.
그리고 cleaned_data를 보면 전체의 데이터가 들어와 있는 것이 아니고, email 하나만 들어있다. 첫번째니까 이러한 것 같다. field상으로 자신보다 아래에 적힌 field는 해당 cleaned_data에서는 확인할 수 없다.
def clean_first_name:
print(self.cleaned_data)
~~
def clean_email:
print(self.cleaned_data)
~~
clean은 항상 마지막에 실행이 되고, 우리가 clean_method에서 return한 값이 다 정리되어 들어있다.
여기서 self.cleaned_data['password'] = '123' 이런식으로 아예 바꿔버릴 수도 있다. 이미 정리되어 있는 값을 다른값으로바꿔버릴 수도 있다.
'Python > airbnb 클론' 카테고리의 다른 글
django sign-up form (0) | 2022.02.16 |
---|---|
django login form 2 with FormView (0) | 2022.02.15 |
django S3, RDS 연동해보기 ! (0) | 2022.02.10 |
django Filtering Form API (0) | 2022.02.09 |
django Filtering (0) | 2022.02.08 |