장고에 Login view, Logout view 제공된다.
1
urls.py
from django.contrib.auth.views import LoginView, LogoutView
from django.urls import path
from accountapp.views import hello_world, AccountCreateView
app_name = 'accountapp'
urlpatterns = [
path('hello_world/', hello_world, name='hello_world'),
path('login/', LoginView.as_view(template_name='accountapp/login.html'), name='login'),
path('logout/', LogoutView.as_view(), name='logout'),
path('create/', AccountCreateView.as_view(), name='create'),
]
2
accountapp/login.html 만들기
{% extends 'base.html' %}
{% block content %}
<div style="text-align: center;">
<div>
<h4>Login</h4>
</div>
<div>
<form action="" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" class="btn btn-primary">
</form>
</div>
</div>
{% endblock %}
화면 잘 출력된다.
3
회원가입 하고 로그인해서 테스트해보자
로그인하면 http://127.0.0.1:8000/accounts/profile/ 로 연결이 된다. (만든적없으니 에러난다.)
* Redirect Mechanism
먼저 next라는 이름을 가진 value를 찾는다. 존재한다면 거기로가는데 없으면 settings.py안에 LOGIN_REDIRECT_URL로 간다. 그것도 없으면 최종적으로 Default로 간다. http://127.0.0.1:8000/accounts/profile/ 이 경우에 디폴트로 찾아간것이다. 이제 이걸 방지해보자.
4
<div class="platypus_header">
<div>
<h1 class="platypus_logo">Platypus</h1>
</div>
<div>
<span>nav1</span>
<span>nav2</span>
<span>nav3</span>
{% if not user.is_authenticated %}
<a href="{% url 'accountapp:login' %}?next={{ request.path }}">
<span>login</span>
</a>
{% else %}
<a href="{% url 'accountapp:logout' %}?next={{ request.path }}">
<span>logout</span>
</a>
{% endif %}
</div>
</div>
분기문으로 로그인 안되어있으면 login 버튼 주고 로그인상태면 logout 버튼을 준다.
{% url 'accountapp:login' %} url을 이렇게 줬는데 로그인을 마친후 다시가야할 경로를 GET형식으로 ?를 붙여 넘겨주자.
next라는 인자를 넘겨줌으로써 로그인을 마치고 원래있었던 페이지로 돌아온다.
버튼 눌러 접속시: http://127.0.0.1:8000/account/login/?next=/account/hello_world/
로그인 직접입력시: http://127.0.0.1:8000/account/login/
5
만약 next 안거치고 http://127.0.0.1:8000/accounts/login/ 직접 입력해서 로그인 접근하면 여전히 디폴트로 넘어온다.
이걸 방지하기위해 이제 LOGIN_REDIRECT_URL를 설정한다.
settings.py
LOGIN_REDIRECT_URL = reverse_lazy('accountapp:hello_world')
LOGOUT_REDIRECT_URL = reverse_lazy('accountapp:login')
'웹 프로그래밍' 카테고리의 다른 글
[pinterest clone (16)] DetailView를 이용한 개인페이지 구현 (0) | 2021.04.28 |
---|---|
[pinterest clone (15)] form 디자인 (0) | 2021.04.28 |
[pinterest clone (13)] CreateView를 통한 회원가입 구현 (0) | 2021.04.27 |
Django가 CRUD로 유명한 이유 (0) | 2021.04.27 |
pycharm에서 서버 디버깅하는법 (디버깅 설정) (0) | 2021.04.27 |