본문 바로가기
개발

[Django] sns - 로그인과 로그아웃 구현하기

by 마스터누누 2017. 6. 30.
728x90
반응형

sns - 로그인과 로그아웃 구현하기



지난시간에 이어 로그인과 인증 관련 기능을 구현해보자

장고는 기본적으로 인증 기능을 가지고 있다.

django.contrib.auth.modelsuser라는 클래스에서 기능을 가지고 있으므로

모델을 만들어 줄 필요는 없다.

뷰도 마찬가지로 이미 구현이 되어있으므로 템플릿만 수정 하면 된다.





1
2
3
4
5
6
7
8
9
<ul class="nav navbar-nav navbar-right">
  {% if user.is_active %}
  <li><a href="{%url 'login' %}"> <span class="glyphicon glyphicon-heart"></span> {{user.username}}</a></li>
  <li><a href="{% url 'logout' %}">Logout</a></li>
  {% else %}
  <li><a href="{%url 'login' %}"> <span class="glyphicon glyphicon-user"></span> Login</a></li>
  <li><a href="{% url 'admin:index' %}">Admin</a></li>
  {% endif %}
</ul>
cs


원래 있던 base.html 템플릿을 수정하자.

여기서 조건문을 사용하여 로그인 여부에 따라서 네비게이션 바가 다르게 보이도록한다.

if user.is_active는 유저의 로그인 상태가 액티브인지 판별하고,

만약 그렇다면 네이게이션 바는 유저의 이름과 로그 아웃 버튼을 출력한다.


만약 로그인 하지 않았으면, 로그인 단추와 관리자 페이지로 이동하는 버튼을 출력한다.





1
2
3
$ python manage.py shell
>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('cow''cow@mooow.com''1q841q84')
cs


아직 가입 폼이 만들어지지 않았으므로 사용자 아이디 생성은 shell 환경에서 진행하도록 하자

우선 django.contrib.auth.models를 추가하고 User.objects.create_user 명령어로 생성한다.


admin 페이지에서 user을 확인해 보면 아이디가 생성됨을 확인할 수 있지만

네비게이션 바의 login을 누르면 에러가 발생한다.

에러는 registration/login.html이 아직 없다는 내용이다.

로그인 뷰는 있는데, 이 로그인 뷰의 템플릿이 없기때문에 발생하는 에러이다.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{% extends 'kilogram/base.html' %}
{% block content %}
 
{% if user.is_active %}
<h2> Welcome, {{user.username}} </h2>
<a href="{% url 'logout' %}">로그아웃</a>
 
{% else %}
{% if form.errors %}
<p>ID나 비밀번호가 일치하지 않습니다.</p>
{% endif %}
 
<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<input type="hidden" name="next" value="" />
{{ form.as_p }}
<button type="submit">로그인</button>
</form>
 
{% endif %}
 
{% endblock %}
cs


그렇다면 로그인 템플릿을 만들어 보도록하자.

Templates 아래에 registration 폴더를 만들고, login.html 파일을 생성한다.

소스 코드는 위와 같다.


base.html의 네비게이션 바를 확장하여 사용하고 blockcententendblock 안에 내용이 들어간다.

이 또한 로그인 했을 때와 하지 않았을 때로 나뉘며 로그인 했을 때는 간단한 인사와 로그아웃 버튼이,

하지 않았을 때는 아이디와 패스워드 입력 폼이 나온다.


입력 폼의 submit을 클릭하면 login으로 post 요청을 준다.

그리고 로그인의 에러가 발생하면 'ID나 비밀번호가 일치하지 않습니다'라는 텍스트를 출력한다.





1
2
# Auth settings
LOGIN_REDIRECT_URL = '/kilogram/'
cs

만약 로그인이 성공하면 account의 profile 페이지로 넘어가는데,

이를 변경하기위해서는 settings.py를 수정해야한다.


여기서 LOGIN_REDIRECT_URL을 로그인 후 연결될 url로 바꾸어준다.

이로써 로그인 리다이렉션이 완료된다.





1
2
3
4
5
6
7
8
{% extends 'kilogram/base.html' %}
{% block content %}
 
<h2> 잘 가요, 안녕. </h2>
<p><a href="{%url 'login'%}">다시 로그인하기</a></p>
 
{% endblock %}
 
cs


그리고 로그아웃을 클릭하면 장고 관리자페이지의 로그아웃 화면이나온다.

이렇게 되는 이유는 아직 로그아웃의 템플릿 파일이 없기 때문이다.

이 또한 파일명이 정해져 있는데, registrationlogged_out.html이다.


이렇게 미리 정해진 파일명은 장고 공식 문서나 소스 내부에서 확인이 가능하다.




출처 : 인프런, 파이썬 웹 프로그래밍, Django로 웹 서비스 개발하기

반응형

'개발' 카테고리의 다른 글

[Backjoon] 5366번 문제 - 화성 수학  (0) 2017.06.30
[Django] sns - 사용자 등록 구현  (0) 2017.06.30
[Django] sns - 앱 초기화  (0) 2017.06.29
[Django] lotto - 앱 다듬기  (0) 2017.06.28
[Django] lotto - POST 처리  (0) 2017.06.28

댓글