42. (app3) Django 로그인과 로그아웃 구현하기
장고는 full framework이기 때문에 기본적으로 인증기능을 가지고 있다.
장고에서는 jango.contrib.auth.modes의 User클래스가 제공되어 모델쪽에 특별한 코딩은 필요가 없다.
1. base.html에서 아래의 부분을 통째로 아래의 것으로 교체.
- 로그인 했을 때는 사용자이름, 로그아웃, Admin 버튼을 보여줌
- 비로그인 상태일 때는 로그인, Admin 버튼을 보여줌.
- 디자인만 보여지고 작동하지 않던 버튼에 url을 추가해준다.
<ul class="nav navbar-nav navbar-right">
<li><a href="#"> <span class="glyphicon glyphicon-user"></span> Login</a></li>
<li><a href="#">Logout</a></li>
<li><a href="{% url 'admin:index' %}">Admin</a></li>
</ul>
<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>
2. 쉘에서 유저 등록해보기
- "python manage.py shell"
- "from django.contrib.auth.models import User"
- "user = User.objects.create_user('chiken','chiken@out.org','1234')" #아이디, 이메일, 비밀번호 순
- "user"
- localhost:8000/admin으로 들어가서 '사용자(들)'을 클릭해 잘 들어갔나 확인
3. mysite/urls.py에 auth 관련 url 추가하기
- 이제 html에서 href="{% url 'login' %}" "{% url 'logout' %}" 를 사용할 수 있게됨.
- 로그인 버튼을 클릭하면 즉, href="{% url 'login' %}" 를 링크해주면 localhost:8000/accounts/login/ 페이지로 자동으로 넘어감.
- 이때 보여지는 로그인 페이지는 4번에서 만들어줌.
- auth.urls를 include할 경우 아래와 같은 url들이 포함됨.
url(r'^accounts/', include('django.contrib.auth.urls')),
^login/$ [name='login']
^logout/$ [name='logout']
^password_change/$ [name='password_change']
^password_change/done/$ [name='password_change_done']
^password_reset/$ [name='password_reset']
^password_reset/done/$ [name='password_reset_done']
^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$ [name='password_reset_confirm']
^reset/done/$ [name='password_reset_complete']
4. kilogram/templates/위치에 registration폴더 생성, login.html생성
- 지정된 경로나 파일명은 auth의 views에 미리 정해져 있는 것임. 장고의 소스파일을 열어보면 알 수 있음.
- href="{% url 'login' %}" 를 통해 연결되는 로그인 페이지 만들기
- 템플릿 확장사용
- 로그인한 사용자가 접속하면 유저이름을 출력하고 , 로그인 단추를 보여줌
- 비로그인 사용자가 접속하면 로그인 폼을 보여줌.
- 로그인 폼은 post로 자기 자신한테 보내게 되어있음. 따라서 로그인 실패시에 에러문 출력.
{% 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 %}
5. settings.py 맨 아래에 LOGIN_REDIRECT_URL 추가
- 로그인에 성공하면 디폴트로 localhost:8000/accounts/profile/ 로 연결되는데 이것을 변경해준다.
- 로그인에 성공했을 때 리다이렉트로 연결되는 url을 변경.
- 아래와 같이 해주면 localhost:8000/kilogram으로 이동한다.
LOGIN_REDIRECT_URL = '/kilogram/' # 로그인에 성공했을 때 리다이렉트로 연결되는 URL 지정.
6. kilogram/templates/registration/logged_out.html 생성
- 로그아웃 버튼을 누르면 여기 페이지로 이동됨.
{% extends 'kilogram/base.html' %}
{% block content %}
<h2> 잘 가요, 안녕. </h2>
<p><a href="{%url 'login'%}">다시 로그인하기</a></p>
{% endblock %}