2010년 6월 7일 월요일

09. 로그인 유지

앞서 django의 사용자 로그인 처리 과정을 알아보았습니다.

이제 로그인된 사용자의 로그인 상태 유지를 위한 session 처리과정에 대해 알아보도록 하겠습니다.

먼저 로그인된 사용자라면 {{form.username}}을 통해 로그인할 사용자의 ID를 받아와 user.username에 저장합니다.

이 상태를 알기 위해 다음과 같은 방법을 사용할 수 있습니다.

 

  • username
  • request.user.id_authenticated()
  • decorator : @login_required

 

위의 세가지 사용방법에 대해 알아보겠습니다.

 

username

 

username은 template에서 사용되어 로그인한 사용자에게 보여줄 부분과 그렇지 않은 사용자에게 보여줄 부분을 나눠서 처리할 수 있게 합니다.

다음은 첫화면(/)에 대한 django의 template 예제입니다.

 

  1. templates/index.html
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  3. <html>
  4. <head>

  5. <title>django Test Page</title>

  6. </head>

  7. <body>

  8. <h2 align="center">Welcome to django Test Page</h2>

  9. {% if user.username %}

  10. <h4 align="right">{{user.username}} 님 반갑습니다.</h4>

  11. {% else %}

  12. <h4 align="right"><a href="/accounts/login">로그인</a>하세요</h4>

  13. {% endif %}

  14. <hr align="center" />

  15. <p></p>

  16. <hr align="center" />

  17. <p align="center">Site managed by yoonani(yoonani72@gmail.com)</p>

  18. </body>

  19. </html>
  20.  

 

위의 예에서와 같이 template 내에서 사용되어 로그인된 사용자에게 보여줄 부분과 로그인 안된 사용자에게 보여줄 부분을 구별지어 보여줄 때 사용할 수 있습니다.

위의 소스를 index.html로 저장하고 사용자가 http://django서버/ 로 접근했을 경우 보여주기 위해 먼저 urls.py를 다음과 같이 작성합니다.

 

  1.  

    urlpatterns = patterns('',

  2. (r'^$', site_main),

  3. (r'^accounts/login/$', 'django.contrib.auth.views.login'),

  4. )

  5.  

 

다음으로 이 main_page 처리를 위한 view를 다음과 같이 작성합니다.(application의 views.py)

 

  1. from django.http import HttpResponse

    from django.contrib.auth.models import User

    from django.template import Context

    from django.template.loader import get_template

  2.  

    def site_main(request):

    template = get_template('index.html')

    variables = Context({'user': request.user})

    output = template.render(variables)

    return HttpResponse(output)

  3.  

 

  • get_template('index.html') : 사용될 template 지정
  • Context({'user': request.user} : 전달될 변수를 dictionary로 만든다. 본 예에서는 user 변수에 대해 로그인된 사용자 정보를 전달한다.
  • template.render(variable) : 앞의 Context()로 만든 변수 dictionary를 template에 적용시킨다.
  • HttpResponse(output) : output으로 만들어지 page를 사용자에게 응답으로 전달한다.

 

 

위의 코드들을 적용하고 개발서버에 작동시키면 로그인 하기 전에는 아래와 같이 나옵니다.

 

 cap01.JPG

 

로그인을 클릭하고 앞서 작성한 로그인 페이지로 이동후 로그인을 하면 다음과 같이 첫 페이지가 등장합니다.

 

 cap01(1).JPG

 

 

 

request.user.is_authenticated()

 

is_authenticated() 메소드는 user 객체의 메소드로 로그인한 사용자의 접속에 대해 True를 반환하는 메소드입니다.

주로 views.py에 사용되어 로그인한 사용자와 그렇지 않은 사용자를 구별하여 처리할 수 있도록 합니다.

다음과 같은 상황을 생각해보도록 합시다.

 

  • 방문자가 http://서버명/home/사용자명으로 접근.

    • /home/사용자명/ 은 로그인한 사용자의 개인 정보 페이지.
  • 로그인 하지 않을 경우 /accounts/login으로 이동.

 

먼저 개인 정보 페이지 template을 작성합니다. (userHome.html)

 

  1. <html>
  2. <head>
  3. <title>django Test : {{username}}</title>
  4. </head>
  5. <body>
  6. <h2 align="center">{{username}} 님의 개인정보 페이지</h2>
  7. </body>
  8. </html>
  9.  

 

urls.py를 수정하여 /home/사용자명/ 을 요청에 대해 view와 연결합니다.

 

  1.  

    urlpatterns = patterns('',
        (r'^$', siteMainPage),
        (r'^accounts/login/$', 'django.contrib.auth.views.login'),
        (r'^home/(\w+)/$', userHomePage),
    )

  2.  

 

위에서 사용된 표현은 정규표현식으로 \w 는 문자, 숫자, 그리고 밑줄(_)을 의미하고 그런 문자가 1개 이상 있는 문자열 그룹(괄호에 묶인것 통째로 한개의 그룹이 됨)을 의미합니다.

 

 

 

views.py에 다음을 추가합니다.

 

  • 로그인한 사용자의 경우 1에서 만든 template과 로그인 정보를 연결하여 사용자의 응답으로 보냅니다.

  • 로그인하지 않은 사용자의 경우 login 페이지로 연결합니다.

 

  1. from django.http import HttpResponseRedirect

     

    def userHomePage(request, username):

    if request.user.is_authenticated() :

  2. template = get_template('userHome.html')
  3. variables = Context({'username' : username})
  4. output = template.render(variables)
  5. return HttpResponse(output)
  6. else :
  7. return HttpResponseRedirect('/accounts/login/')

 

 

로그인 하지 않은 사용자가 http://서버명/home/사용자명/ 으로 접근하면 로그인 페이지로 이동하고 로그인을 해야지만 사용자의 개인정보 페이지로 이동합니다.

 

 

 

decorator : @login_required

위의 userHomePage() view 앞에 @login_reqquired를 추가하면 해당 view는 로그인한 사용자들만 볼 수 있으며 그렇지 않은 사용자들은 /accounts/login/ 으로 이동합니다.

views.py의 userHomePage를 다음과 같이 수정해 보도록 합시다.

 

  1. from django.contrib.auth.decorators import login_required
  2. @login_required
  3. def userHomePage(request, username):
  4. template = get_template('userHome.html')

    variables = Context({'username' : username})

    output = template.render(variables)

    return HttpResponse(output)

  5.  

 

 위와 같이 수정하면 앞선 2번의 예와 동일한 결과를 가져오므로 더욱 편하게 사용할 수 있습니다.

 

 

 

로그아웃

django의 로그아웃 기능은 사용자 인증 기능에서 제공하는 logout()을 사용하면 됩니다.

먼저 로그아웃 기능을 수행을 위해 views.py에 다음을 추가합니다.

 

  1. views.py
  2. from django.contrib.auth import logout
  3.  
  4. def logout_page(request):
        logout(request)
        return HttpResponseRedirect('/')

 

그다음 사용자의 로그아웃 요청과 추가한 view를 연결합니다.

 

  1. urls.py
  2. ...
  3. (r'^accounts/logout/$', logout_page),
  4. ...

 

그럼 이제 http://서버명/accounts/logout/ 요청을 해보시기 바랍니다.

 

이 글은 스프링노트에서 작성되었습니다.

댓글 없음:

댓글 쓰기