PyCharm과 함께 DJango와 RestFramework를 활용하여 간단한 게시판 만들기(3)

오랜만에 작성하는 포스팅 입니다. 그간 업무로 바쁘다 보니, 오늘에서야 포스팅을 하나 남기게 되네요ㅠㅠㅠ 오늘부터는 페이스를 조금 조절하여, 한 게시물 당 하나의 주제만을 다루려고 합니다. 오늘 진행할 주제는 다음과 같습니다.

– 간단한 Login 만들기
– django form 클래스를 활용하여 폼 만들기

서버 켜기

간만에 하는 포스팅이니, 지난 번 까지 작업한 걸 다시 한번 볼까요?

파일 구성보기
지난번에 했던 프로젝트를 다시 열고, 프로젝트 구성을 한번 봅시다. 대충 저기까지 했었던 거 같네요. 일단, 서버를 켭시다.
서버 구동 확인!
서버는 다양한 방법으로 켤 수 있죠? 저는 주로 오른쪽 위의 디버그 버튼을 눌러서 켜는 편 입니다. 어쨌든 서버를 켜고…
서버에 에러가...!
접속을 짜…….잔? 뭔가 에러가 나네요?? 뭐지?? view.py 파일 안에 post_list 함수의 21번째 라인에서 문제가 있다고 하니…
찾아 갑시다!
해당 파일에 바로 가봅시다! 기본적으로 pyCharm 에서는 Ctrl + Shift + N 이 파일 네비게이션 단축키 입니다.
브레이크 포인트
의심이 되는 곳은 잘 모르겠네요… 21번째 라인이라고 했으니, 그 위에 있는 try ~ except 구문부터 코드 분석을 좀 해봅시다. try 가 시작되는 부분에 브레이크를 하나 걸고,
브레이크가 걸린 모습
사이트에 다시 들어가 봅시다! 그러면 디버거에 걸려서 해당 위치의 코드가 잠시 잡힙니다. 자, 지금부터 코드 하나하나가 어떻게 흘러가는지 볼까요?
익셉션 확인
page 값이 int가 아닌지, PageNotAnInteger 익셉션이 발생 했네요. try ~ except 로 예외처리를 한 코드라, 일단 문제 없이 코드가 흘러 갑니다.
예외처리
이렇게 예외처리가 하나 작동 하네요.
그리고 예외처리 결과 확인
그리고, 예외 처리 결과를 확인하기 위해 posts 의 데이터를 확인해 봅시다. 라는 모양으로, Page 인스턴스가 할당되어져 있는걸 볼 수 있습니다. 아직까지 문제가 없네요.
다른 곳에서 발생한 익셉션!
어?? 하지만 한 스텝을 더 갔더니 다른 예외가 발생했네요…!?!?
익셉션 내용
더 안쪽으로 와보니, TypeError 라는 익셉션이 안쪽에서 발생하고 있었습니다. 이번엔 다른 곳에 브레이크를 걸어서 확인해 볼까요?
컨텍스트 생성 확인
이번에는 Context 가 생성되는 부분을 확인해 봅시다. TypeError 였고, int로 바꾸는 부분이니…. 저기 보이는 int(page) 가 유력하네요. 해당 값을 Watches 에 넣어보니, 아니나 다를까…. 같은 예외가 발생했네요.
page는 None 입니다 고객님.
그래서 변수를 확인해 보니, page가 None 이네요! 그러고 보니, page=1 의 형태로 접속을 테스트 했지… 비워 놓고는 안해봤네요.
예외처리 추가!
그래서 page가 None 이면 깔끔하게 1로 셋팅하도록 했습니다.
쨔쟌!
쨘!! 하고 이전에 작성했던 내용이 나왔습니다. 휴… 다행이네요.

로그인 기능 만들어 보기

이제 지금까지 했던 작업들이 정상적이란 사실을 알았으니, 본격적으로 로그인 기능을 한번 개발해 보겠습니다. django 에서 forms 을 다루는 방법에 대해서 간략하게 알아보고, 간단한 로그인 인증 방법과 CSRF 처리에 대한 것을 간단하게 알아볼 것 입니다.

로그인 url 만들기
가장 먼저, 로그인을 위한 URL 을 하나 만듭시다. urls.py로 가서,
URL 설정
url 을 하나 만들어 줍시다. login 이라는 view 를 연결할 것인데, 여기서는 PyCharm 의 단축키로 만들어 볼 겁니다. login 이 import 되지 않은 상태에서 먼저 네임을 정하고,
Quick fix 기능
Alt + Enter 키를 눌러서 Quick fix 기능을 켜 봅시다. import 부터 ignored 까지, 다양한 제안을 해주는데… 2번째의 Create function ‘login’을 눌러서
create login function!
login 함수를 만들어 줍시다.
인자 변경
인자는 저희가 쓰고 이해하기 쉽게 request 로 바꿔 주시구요,
함수 옮기기
그리고 login 함수에서 F6을 눌러서 Move Class or Function 리펙토링 기능을 실행 합니다. … 을 눌러서
함수가 옮겨질 곳 정하기
함수를 옮길 곳을 정하고…
옮길 위치를 확인 한 뒤... Refactor!
그리고는 Refactor를 누르거나 Preview를 눌러서 해당 명령을 수행 합니다.
Preview를 누른 모습
Preview를 누르면, 어떻게 변하는지 확인할 수 있습니다. Do Refactor 를 눌러서 명령을 실행 합시다.
자동으로 정리된 모습
위쪽에 from post_service.views import post_list, login 으로 변경된 것을 확인할 수 있습니다.
옮겨진 함수의 모습
함수도 정상적으로 옮겨 졌네요.
기본 내용 만들기
위쪽에 post_list 함수를 참고하여, 기본적인 폼을 만들어 둡시다.
template 생성하기
같은 방법으로, template도 쉽고 빠르게 만들 수 있습니다. 역시 템플릿 이름만 정의하고, Quick Fix(Ctrl + Enter)를 누르면 템플릿을 생성하는 제안이 나오고,
템플릿 설정하기
템플릿 이름과 위치를 정의하면…
템플릿 내용 만들기
해당 위치에 템플릿 파일이 생깁니다. 그리고 안의 내용을 채워 넣어 봅시다!
잘못 정의된 url 확인하기
일단, 만들어진 login 에 접속해 볼까…..요? 어라?? 뭔가 잘못 되었네요? url 정의가 잘못된 모양 입니다.
/ 를 지웁시다.
상위 url 에서 / 를 정의해 줘서, 하위 url 에서는 시작이 / 이면 안됩니다… 매번 까먹고 매번 같은 실수를 하는 녀석이네요…
템플릿 호출 화면
그리고 난 뒤, 정상적으로 템플릿이 로드 된 걸 볼 수 있습니다.
forms.py 만들기
File -> new -> python file 을 눌러, 새로운 Python 파일을 하나 만듭시다. Form 데이터 들을 관리할 forms.py 라는 이름으로 만들어 봅시다.
모듈을 불러옵시다!
그리고는 django 에 포함된 forms 를 import 해 봅시다.
클래스의 기초 내용 정의
그리고 기초 내용을 살짝 정의하고….
Form 정의하기
마치 Model 을 정의하듯, 폼을 정의해 줍시다. id와 password를 받을 것이고, 각각 CharField 를 가진다- 라고 정의해 봅시다.
폼 사용하기
그리고 이렇게 정의한 Form 을 login view에서 사용해 봅시다. Context 를 넘길때, ‘login_form’ 이라는 이름으로 LoginForm 을 넘겨 봅시다.
Quick Fix 로 내용 불러오기
import 부터 하신거 아니라면, Quick fix 등으로 문제 해결 하시는거 잊지 마시구요~
확인확인!
이렇게 import 내용까지 확인하면 끝!
form 출력해보기
이제 템플릿에다 저희가 설정한 login_form 을 출력해 보는 일만 남았습니다. form 태그 안에 저희가 설정한 form 을 출력해 봅시다.
폼이 설정 되었습니다!
그리고 새로 고침을 해 봤더니… 뙇!
submit 버튼 만들기
submit 버튼을 따로 만들어 주도록 합시다. 관리 대상이 아니니까요.
form 정의하기
그리고 form 에다 갈 방향과 방법을 각각 정의해 둡니다. Login 이니까 POST 방식으로 하고, 저희가 원하는 특정 URL을 action에 정의해 둡니다.
CSRF 에러와 마주하기
그리고 form 에서 로그인을 시도했더니….. CSRF 에러가 뜹니다. 오호? CSRF는 Cross Site Request Forgery 의 약어로, 일종의 요청 사기 입니다. 남의 브라우저 정보를 이용하여 다른 위치에서 요청을 보내 정보를 빼내는 형태죠. Django는 기본적으로 CSRF에 대한 방어책을 제공해 줍니다.
URL도 실수 했네요!
그 전에 URL을 보니 /board/login/board/login/validate 로 갔네요…. URL을 다시 바꿔줍시다.
URL은 안심!
URL은 정상적으로 넘어가는 걸 보며, 안심하고…
스크린샷, 2015-03-13 23:30:02
이제는 CSRF 문제만 해결하면 됩니다. template 에다가 {% csrf %} 태그를 사용하라네요? 그대로 해 줍시다.
CSRF 토근 삽입
Django 에서 사용하는 CSRF 방어책은 CSRF Token을 폼에 삽입하고, 요청을 받아 처리할 시에 Django에서가 이를 확인하는 식으로 방어를 합니다. 따라서 POST 방법인 form에 CSRF 태그를 삽입해 줍시다.
csrf 처리하기
그리고 context에 CSRF 값을 갱신 시킵니다. django.core.context_processors 에 포함된 csrf 함수를 삽입해 보죠.
CSRF 처리 완료!
이렇게요. 이렇게 해주면, 자동으로 template 에 있는 csrf 토큰 값을 갱신 / 처리하여 결과를 보내게 됩니다.
확인!
이렇게 import 된 것도 확인 하시고,
로그인 시도!
이제 로그인을 다시 시도해 봅시다!
ID랑 비밀번호 입력하기
아무런 ID랑 비밀번호를 입력해 볼까요?
CSRF 처리 끝!
로그인 버튼을 누르니, URL 이 validate 로 바뀌는 것을 볼 수 있습니다. 일단 URL은 잘 바뀌는 것 같네요. CSRF 처리가 잘 된 거 같습니다.
validate URL 만들기
이제 실제 로그인 기능을 만들 차례 입니다. login/validate 라는 URL을 하나 만듭시다.
login_validate 함수 생성하기
앞과 같은 방법으로, login_validate 함수를 하나 만들고…
import 하기
인증을 위한 다양한 모듈이 있는 django.contrib.auth 패키지를 불러와 봅시다. 그 안에 있는 인증 기능인 authenticate() 함수와 실제 로그인을 처리하는 login() 함수가 사용될 예정 입니다. 저희는 login 을 위에서 정의해 버렸으니… auth 모듈을 불러와서 직접 사용하는 방법으로 처리해 봅시다.
인증 코드 작성하기
authenticate() 함수는 username과 password 등, 여러가지 파라메터를 통하여 인증 과정을 수행하게 됩니다. django.contrib.auth.models 에 포함된 User 모델의 데이터로 검증을 수행하게 되죠. 일단, request로 넘어오는 데이터를 LoginForm 으로 받아서 폼 검증 과정을 Form 클래스에 전담시키고, 그 안에 있는 내용을 통하여 인증을 하게 코드를 짭니다.
로그인 로직 구현하기
기본적인 예외들을 추가하면 간단한 로그인 로직 구현 완료!
정규표현식을 잘 떠올려보세요!
그리고, 잠시 잊고 지나갔는데…. login/validate 로 접속 했는데, 이상하게 login 화면이 떴었죠? urls.py 를 잘 보면, url 패턴이 잘못되어져 있는걸 알 수 있습니다.
정규 표현식에 대한 간략한 설명~
바로 $를 빼 먹었네요!! ^가 시작은~ 이라는 의미고, $가 끝이~ 라는 의미 입니다. 즉, ^login/ 이라고만 쓰면 ‘시작이 login/ 인 주소’ 가 되며, 사실상 login/validate 도 login/ 을 포함하게 됩니다. 따라서 login/validate 로 접속을 해도 login/ 으로 접속하게 되는 셈(앞에 있으니, 먼저 매칭이 되어 먼저 처리가 되겠죠?) 입니다. 따라서 끝에 $를 붙여서 ‘시작이 login/ 이면서 끝인 주소’ 란 의미를 붙여줘야 합니다.
로그인 시도!!
이렇게 수정하고 나서, 다시 접속을 시도해 보면….
멘붕
……….
삽질의 달인
url 패턴을 잘 기억하시고 설정해 주세요… 이런 삽질을 피하실 수 있습니다.
간다!!
자, 다시 시도!!!
멘붕2
……
에러 찾아 삼만리
아래쪽 에러 내용을 보니, 다행 스럽게도 views.py 에 어느 위치인지 잘 나와 있네요… WSGIRequest 는 get 이 없다니 뭔 소릴까요…?
버그 수정...
……공식 문서를 보니, request.POST 형태로 데이터만 넘겨야 하네요. 하하하핳…. 내용을 참고하여 좀 수정을 하고…
도전@@@!!
자, 신나게 다시 도전!!
멘붕3
…..
뭔소리야!
아니, 내가 정의한 id가 없다는 게 말이 됩니까!?!? 브레이크 포인트를 걸어서, 이게 무슨 소린지 눈으로 보러 갑시다!
로그인 폼이 비정상.......
새로 고침 했다가, 정상적으로 로직이 작동되는 걸 확인할 수 있었네요….. 하핳…
예상과 다른 내용물들!
다시 로그인을 시도하고 내용을 보니…… 아… LoginForm 클래스가… 뭔가 예상과는 달라 보입니다.
제 삽질을 여러분도 함께 하게 됩니다. 핳핳핳
문서는 이래서 잘 봐야 합니다. Form 데이터는 cleaned_data 에 저장된다고 합니다. 문제가 없다면 말이죠…. 따라서, 내용을 수정해 줘야 겠네요.
딕셔너리 확인!
dictionary 니, 이렇게 접근해서 쓰면 되니까….
코드 수정하기!
이렇게 코드를 수정해 줍시다.
아 제발!!!
마지막으로 시도 해 봅시다…
멘붕4... 가 아닌데?
…….. 가 아니라, 정상 작동하네요!!
admin 에 접근!
이제 사용자가 필요한 시점이네요!! 지난번에 만든 admin 페이지 기억하시죠? /admin/ 에 만들었던! 거기로 접속해서
사용자를 찾읍시다아~
짠! 여기서 Users 에 들어가서
사용자 확인하기!
지난번에 만들었던 계정을 확인 합니다. 멋 하면 직접 하나 만드셔도 됩니다~
로그인 시도 마지막!
자, 정직하게 지난번에 만들었던 계정으로….
test1 / test1 은 귀찮아서가 아니라, 정직하게 입니다.
이렇게 정직하게 입력하고….
멘붕4
……
땡 탈락!
실수로 redirect 에 경로를 잘못 설정했네요… 다시다시~~
땡 탈락! -100점!
아차차, 사용법도 잘못 했었어요…. 다시다시~~
오오오!!
그리고 로그인을 시도 했더니 이렇게!!
화장을 고치고~
잘못된 URL을 고치고,
마지막 입니다!
다시 로그인을 시도하면…
로그인 되었습니다!!! 표시가 안되서 잘 모르겠지만요...
짠!!

마치며…

이번 시간에는 간단하게 Form 사용 방법과 사용자 인증에 대해서 알아 봤습니다. 글쓰기와 API 붙이기 까지 해야지, 이 강좌가 완전히 끝이 날 테지만….. 아직 갈 길이 머네요. 아마 다음 포스팅은 로그인 한 사용자에게 글쓰기 권한을 주는 것 과 Form 을 조금 더 활용하여 글 쓰기 기능을 만드는 것과 비밀번호 폼 만드는 것 등에 대한 내용이 될 거 같습니다.

* 중간 중간에 발생하는 오류 장면들은 제가 글을 작성하면서 마주친 문제점들과 이를 어떻게 해결 했는가에 대해서 알려드리기 위해 일부러 포함 시키고 있습니다. 실제로 작업하면서 마주친 애들이니, 혹여나 같은 실수를 하시면 저렇게 풀기도 하는구나- 하고 봐주세요. 도움이 되실지도 모르니까요.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

 

[출처] https://devissue.wordpress.com/2015/03/13/pycharm%ea%b3%bc-%ed%95%a8%ea%bb%98-django%ec%99%80-restframework%eb%a5%bc-%ed%99%9c%ec%9a%a9%ed%95%98%ec%97%ac-%ea%b0%84%eb%8b%a8%ed%95%9c-%ea%b2%8c%ec%8b%9c%ed%8c%90-%eb%a7%8c%eb%93%a4%ea%b8%b03/

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
17 PyCLIPS Python Module file 졸리운_곰 2017.05.31 1481
16 A Flask API for serving scikit-learn models file 졸리운_곰 2017.05.31 589
15 tensorflow-kr.pdf [텐서플로우 튜토리얼] 한글 번역본 file 졸리운_곰 2016.11.25 4476
14 TensorFlow의 기본 사용법 졸리운_곰 2016.11.25 604
13 텐서플로우 시작하기 file 졸리운_곰 2016.11.25 773
12 Integrating Python and R Part III: An Extended Example file 졸리운_곰 2016.11.16 527
11 Integrating Python and R Part II – Executing R from Python and Vice Versa 졸리운_곰 2016.11.16 1543
10 Integrating Python and R into a Data Analysis Pipeline – Part 1 졸리운_곰 2016.11.16 635
9 Calling R from Python file 졸리운_곰 2016.11.16 450
8 TensorFlow의 기본 사용법 졸리운_곰 2016.06.11 725
7 텐서플로우 시작하기 file 졸리운_곰 2016.06.11 774
6 기계 학습의 A to Z : 인구 변화 시각화와 예측 file 졸리운_곰 2015.05.21 1736
5 기계 학습의 A to Z : scikit-learn을 활용한 기계 학습(문서 분류) file 졸리운_곰 2015.05.21 2402
4 기계 학습의 A to Z : IPython notebook과 scikit-learn을 활용한 기계 학습 file 졸리운_곰 2015.05.21 2006
3 기계 학습의 A to Z : scikit-learn을 활용한 기계 학습 (군집화, Clustering) file 졸리운_곰 2015.05.21 2084
2 기계 학습의 A to Z : scikit-learn을 활용한 기계 학습 (차원 축소) file 졸리운_곰 2015.05.21 2182
1 기계 학습의 A to Z : scikit-learn을 활용한 기계 학습(모델 평가) [1] file 졸리운_곰 2015.05.21 1411
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED