참고 : https://docs.djangoproject.com/en/3.2/topics/auth/default/
from django.urls import path
from . import views
app_name = 'accounts'
urlpatterns = [
path('login/', views.login, name='login'),
]
from django.contrib.auth import login as auth_login
from django.contrib.auth.forms import AuthenticationForm
def login(request): # GET(로그인 페이지), POST(실제로 실행시켜주는 로직) 요청 둘다 처리
if request.user.is_authenticated:
return redirect('articles:index') # 로그인되어 있으면 인덱스 페이지로 이동
if request.method == 'POST':
form = AtuthenticationForm(request, request.POST)
if form.is_valid():
auth_login(request, form.get_user())
return redirect('articles:index')
else:
form = AuthenticationForm()
context = {
'form' : form,
}
return render(request, 'accounts/login.html', context)
login(request, user, backend=None)
유저를 삭제하는게 아닌, Session을 삭제하는것
# accounts/views.py
from django.contrib.auth import logout as auth_logout
from django.views.decorators.http import require_POST
@reuqire_POST
def delete(request):
if request.method == 'POST':
auth_logout(request):
return redirect('articles:index')
<!-- base.html -->
<form action="{% url 'accounts:logout' %}" method="POST">
{% csrf_token %}
<input type="submit" value="Logout">
</form>
{% if request.user.is_authenticated %}
<h3> Hello, {{ user }} </h3>
{% else % }
<h3> Hi </h3>
{% endif % }
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
if request.method == 'POST':
form = AuthenticationForm(request, request.POST)
if form.is_valid():
auth_login(request, form.get_user())
return redirect(request.GET.get('next') or 'articels:index'
비 로그인 상태에서 삭제를 누르고 로그인을 하면 405에러가 발생. 왜? next 쿼리는 GET 방식으로 받는데 두번째 require_POST 데코레이터에 걸리기 때문.
@login_required
@require_POST
def delete(request, pk):
article = get_object_or_404(Article, pk=pk)
article.delete()
return redirect('aritcles:index')
# 해결 코드
@required_POST
def delete(request, pk):
if request.user.is_authenticated:
article = get_object_or_404(ARticle, pk=pk)
article.delete()
return redirect('articles:index')