django의 로그인 처리는 django의 Model-Template-View 기반 처리를 그대로 따릅니다.
Model 은 앞선 models.Users 객체를 사용하며
Template의 경우는 프로젝트의 settings.py 에 정의된 TEMPLATE_DIRS 아래에 Template으로 사용할 html 문서를 사용하는 것 외에 사용자 로그인을 위한 TEMPLATE_DIRS/registration/login.html 을 작성한 것을 로그인 페이지로 사용합니다.
로그인 과정중 사용하는 사용자의 요청(결국은 시스템이 만들어내는) 은 다음과 같은 요청들이 존재합니다.
- ^accounts/login
- ^accounts/logout
- ^accounts/profile
그리고 요청에 따른 로그인 처리등을 핸들링하는 몇가지 정해진 view 들이 존재합니다.
이런 기본 지식을 가지고 실제 사용하는 예를 살펴보도록 합시다.
1. 로그인 URL 추가 - urls.py
- urlpatterns = patterns('',
- ...
- (r'^accounts/login/$', 'django.contrib.auth.views.login'),
- ...)
- 추후에 설명하겠지만 위와 같이 urls.py를 작성하면 "http://본인의 서버명/accounts/login"으로 요청하면 django의 login view로 연결합니다.
2. login form의 작성
위에 사용한 로그인 뷰는 TEMPLATE_DIRS/registration/login.html을 템플릿으로 사용하며 개발자가 개발하는 시스템에 맞도록 구축하여 사용합니다. 예를 위해 다음과 같이 작성합도록 합시다.
-
<html>
-
<head>
-
<title>로그인 form</title>
-
</head>
-
<body>
-
{% if form.erros %}
-
<p>로그인 과정중 오류가 발생하였습니다.</p>
-
<p>ID와 암호를 확인해 주세요</p>
-
{% endif %}
-
<h2>사용자 로그인</h2>
-
<form method="POST" action=".">
-
<!-- form.username : ID를 위한 <INPUT TYPE="text" /> 삽입 //-->
-
<p><label for="userID">사용자 ID</label> {{ form.username }}</p>
-
<!-- form.password : 암호를 위한 <INPUT TYPE="password" /> 삽입 //-->
-
<p><label for="userPWD">사용자 암호</label> {{ form.password }}</p>
-
<input type="submit" value="로그인" />
-
</form>
-
</body>
-
</html>
위의 코드를 개발 서버에서 요청하면 다음과 같은 결과를 보여줍니다. (http://127.0.0.1:8000/accounts/login/)
이 상태에서 바로 사용자 ID와 사용자 암호를 넣고 로그인 버튼을 누르면 다음과 같은 에러를 만날수 있는데 이는 django에서 크로스 사이트 스크립팅(cross-site scripting) 공격에 대해 무방비임을 알리는 에러메세지입니다.
이같은 상황이 발생할 경우 <form> 태그 옆에 아래와 같이 django의 csrf 토큰을 추가하는 것으로 방지할 수 있습니다.(이에 대해서는 추후 설명하도록 하겠다)
-
<form method="POST" action=".">{% csrf_token %}
이제 비어있는 사용자 ID 혹은 틀린 암호를 넣고 로그인하여 보면 다음과 같은 에러가 나오는데 이는 위에서 {% if form.errors %}에 의해 나타나는 것임을 알 수 있습니다.
정상적으로 로그인 하였다면 아직은 로그인 이후 이동할 곳을 작성하지 않아 에러가 나옵니다.
3. 로그인 이후 이동할 페이지
이제 로그인 이후 기본적으로는 ^accounts/profile/$로 이동을 하나 form에 next이름을 갖는 숨김 폼필드(<INPUT TYPE="HIDDEN" NAME="next">)를 작성하여 이동할 페이지를 정할 수 있습니다.
예제에서는 첫 페이지로 이동하도록 하겠습니다.
<FORM> 안에 다음과 같은 요소를 삽입합니다.
-
<INPUT TYPE="HIDDEN" NAME="next" VALUE="/" />
위의 코드는 로그인이 정상적으로 이뤄지면 첫 페이지로 이동하라는 의미입니다.
이상으로부터 최종 수정된 login.html은 다음과 같습니다.
- <html>
-
<head>
- <title> 로그인 form</title>
- </head>
- <body>
- {% if form.errors %}
- <p>로그인 과정중 오류가 발생하였습니다.</p>
- <p>ID 와 암호를 확인해 주세요</p>
- {% endif %}
- <h2>사용자 로그인</h2>
- <form method="POST" action=".">{% csrf_token %}
- <!-- form.username : ID를 위한 <INPUT TYPE="text" /> 삽입 //-->
- <p><label for="userID">사용자 ID</label> {{ form.username }}</p>
- <!-- # form.password : 암호를 위한 <INPUT TYPE="password" /> 삽입 //-->
- <p><label for="userPWD">사용자 암호</label> {{ form.password }}</p>
- <INPUT TYPE="HIDDEN" NAME="next" VALUE="/" />
- <INPUT TYPE="submit" VALUE="로그인" />
- </form>
- </body>
-
</html>
간략히 로그인 과정에 대해 살펴보았습니다. 이를 요약하면
기본적인 로그인 화면 구성을 위해
- 로그인 url 생성
- 로그인 Form 작성
- 로그인 후 이동할 페이지 지정
으로 볼 수 있습니다.
본 예제를 위해 수정한 파일은 urls.py과 TEMPLATE_DIRS/registration/login.html 입니다.
이 글은 스프링노트에서 작성되었습니다.
댓글 없음:
댓글 쓰기