앞서 django의 사용자 로그인 처리 과정을 알아보았습니다.
이제 로그인된 사용자의 로그인 상태 유지를 위한 session 처리과정에 대해 알아보도록 하겠습니다.
먼저 로그인된 사용자라면 {{form.username}}을 통해 로그인할 사용자의 ID를 받아와 user.username에 저장합니다.
이 상태를 알기 위해 다음과 같은 방법을 사용할 수 있습니다.
- username
- request.user.id_authenticated()
- decorator : @login_required
위의 세가지 사용방법에 대해 알아보겠습니다.
username
username은 template에서 사용되어 로그인한 사용자에게 보여줄 부분과 그렇지 않은 사용자에게 보여줄 부분을 나눠서 처리할 수 있게 합니다.
다음은 첫화면(/)에 대한 django의 template 예제입니다.
- templates/index.html
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
- <html>
-
<head>
-
<title>django Test Page</title>
-
</head>
-
<body>
-
<h2 align="center">Welcome to django Test Page</h2>
-
{% if user.username %}
-
<h4 align="right">{{user.username}} 님 반갑습니다.</h4>
-
{% else %}
-
<h4 align="right"><a href="/accounts/login">로그인</a>하세요</h4>
-
{% endif %}
-
<hr align="center" />
-
<p></p>
-
<hr align="center" />
-
<p align="center">Site managed by yoonani(yoonani72@gmail.com)</p>
-
</body>
- </html>
위의 예에서와 같이 template 내에서 사용되어 로그인된 사용자에게 보여줄 부분과 로그인 안된 사용자에게 보여줄 부분을 구별지어 보여줄 때 사용할 수 있습니다.
위의 소스를 index.html로 저장하고 사용자가 http://django서버/ 로 접근했을 경우 보여주기 위해 먼저 urls.py를 다음과 같이 작성합니다.
-
urlpatterns = patterns('',
-
(r'^$', site_main),
-
(r'^accounts/login/$', 'django.contrib.auth.views.login'),
-
)
-
다음으로 이 main_page 처리를 위한 view를 다음과 같이 작성합니다.(application의 views.py)
-
from django.http import HttpResponse
from django.contrib.auth.models import User
from django.template import Context
from django.template.loader import get_template
-
def site_main(request):
template = get_template('index.html')
variables = Context({'user': request.user})
output = template.render(variables)
return HttpResponse(output)
-
- get_template('index.html') : 사용될 template 지정
- Context({'user': request.user} : 전달될 변수를 dictionary로 만든다. 본 예에서는 user 변수에 대해 로그인된 사용자 정보를 전달한다.
- template.render(variable) : 앞의 Context()로 만든 변수 dictionary를 template에 적용시킨다.
- HttpResponse(output) : output으로 만들어지 page를 사용자에게 응답으로 전달한다.
위의 코드들을 적용하고 개발서버에 작동시키면 로그인 하기 전에는 아래와 같이 나옵니다.
로그인을 클릭하고 앞서 작성한 로그인 페이지로 이동후 로그인을 하면 다음과 같이 첫 페이지가 등장합니다.
request.user.is_authenticated()
is_authenticated() 메소드는 user 객체의 메소드로 로그인한 사용자의 접속에 대해 True를 반환하는 메소드입니다.
주로 views.py에 사용되어 로그인한 사용자와 그렇지 않은 사용자를 구별하여 처리할 수 있도록 합니다.
다음과 같은 상황을 생각해보도록 합시다.
-
방문자가 http://서버명/home/사용자명으로 접근.
- /home/사용자명/ 은 로그인한 사용자의 개인 정보 페이지.
- 로그인 하지 않을 경우 /accounts/login으로 이동.
먼저 개인 정보 페이지 template을 작성합니다. (userHome.html)
- <html>
- <head>
- <title>django Test : {{username}}</title>
- </head>
- <body>
- <h2 align="center">{{username}} 님의 개인정보 페이지</h2>
- </body>
- </html>
urls.py를 수정하여 /home/사용자명/ 을 요청에 대해 view와 연결합니다.
-
urlpatterns = patterns('',
(r'^$', siteMainPage),
(r'^accounts/login/$', 'django.contrib.auth.views.login'),
(r'^home/(\w+)/$', userHomePage),
) -
위에서 사용된 표현은 정규표현식으로 \w 는 문자, 숫자, 그리고 밑줄(_)을 의미하고 그런 문자가 1개 이상 있는 문자열 그룹(괄호에 묶인것 통째로 한개의 그룹이 됨)을 의미합니다.
views.py에 다음을 추가합니다.
-
로그인한 사용자의 경우 1에서 만든 template과 로그인 정보를 연결하여 사용자의 응답으로 보냅니다.
- 로그인하지 않은 사용자의 경우 login 페이지로 연결합니다.
-
from django.http import HttpResponseRedirect
def userHomePage(request, username):
if request.user.is_authenticated() :
- template = get_template('userHome.html')
- variables = Context({'username' : username})
- output = template.render(variables)
- return HttpResponse(output)
- else :
- return HttpResponseRedirect('/accounts/login/')
로그인 하지 않은 사용자가 http://서버명/home/사용자명/ 으로 접근하면 로그인 페이지로 이동하고 로그인을 해야지만 사용자의 개인정보 페이지로 이동합니다.
decorator : @login_required
위의 userHomePage() view 앞에 @login_reqquired를 추가하면 해당 view는 로그인한 사용자들만 볼 수 있으며 그렇지 않은 사용자들은 /accounts/login/ 으로 이동합니다.
views.py의 userHomePage를 다음과 같이 수정해 보도록 합시다.
- from django.contrib.auth.decorators import login_required
- @login_required
- def userHomePage(request, username):
-
template = get_template('userHome.html')
variables = Context({'username' : username})
output = template.render(variables)
return HttpResponse(output)
-
위와 같이 수정하면 앞선 2번의 예와 동일한 결과를 가져오므로 더욱 편하게 사용할 수 있습니다.
로그아웃
django의 로그아웃 기능은 사용자 인증 기능에서 제공하는 logout()을 사용하면 됩니다.
먼저 로그아웃 기능을 수행을 위해 views.py에 다음을 추가합니다.
- views.py
- from django.contrib.auth import logout
- def logout_page(request):
logout(request)
return HttpResponseRedirect('/')
그다음 사용자의 로그아웃 요청과 추가한 view를 연결합니다.
- urls.py
- ...
- (r'^accounts/logout/$', logout_page),
- ...
그럼 이제 http://서버명/accounts/logout/ 요청을 해보시기 바랍니다.
이 글은 스프링노트에서 작성되었습니다.
댓글 없음:
댓글 쓰기