먼저 로그인과 로그아웃은 모두 함수로 구현을 해놨었습니다. 그러다 어제 로그인과 로그아웃함수를 작성하지 않고 urls.py
만으로 기능하게 할 수 있다는 소식을 듣고 바로 적용해보았습니다.
from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
app_name = 'user'
urlpatterns = [
path('signup/', views.signup_view, name='signup'),
path('login/', auth_views.LoginView.as_view(template_name='user/login.html'), name='login'),
]
장고 내장함수에 있는 views
라는 모듈을 사용해 작성했습니다. 전 이미 views
라는 파일이 있어 혼동이 될 수 있으므로 auth_user
라는 별칭을 지정해줬습니다.
urlpatterns
에 주소를 입력해주고 LoginView.as_view
내장 함수를 불러와 로그인 시 로드할 html
파일을 지정해 줬습니다.
그랬더니 신기하게도 로그인이 되더군요.. 장고가 지원하는 수많은 기능이 무엇인지 체감하게 되는 순간이였습니다.
이후 로그인 발생 시 일어나는 오류를 띄워주기 위해 html파일을 하나 만들었습니다.
{% if form.errors %}
{% for field in form %}
{% for error in field.errors %}
<div>
<strong>{{ field.label }}</strong>
{{ error }}
</div>
{% endfor %}
{% endfor %}
{% for error in form.non_field_errors %}
<div>
<strong>{{ error }}</strong>
</div>
{% endfor %}
{% endif %}
위에 있는 div는 로그인 폼을 작성했는데 맞지 않아 발생하는 오류를 띄워주고 밑에 있는 div는 로그인 폼을 작성하지 않았을 때 오류를 띄워줍니다.
로그아웃은 로그인에 비해 작업하기가 수월했습니다. 따로 html을 작성할 필요도 없고 에러날 일도 적거니와 이미 로그아웃을 실행시키는 버튼도 존재했으니 urls.py
만 수정해줬습니다.
from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
app_name = 'user'
urlpatterns = [
path('signup/', views.signup_view, name='signup'),
path('login/', auth_views.LoginView.as_view(template_name='user/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]
가져온 모듈에서 LogoutView.as_view
함수를 사용해주는게 끝입니다. 작성하고 로그아웃 버튼을 누르니 놀라울 정도로 잘 작동했습니다. 그간 작성했었던 함수들이 무색해지는 순간이였습니다...
def signup_view(request):
form = UserForm()
if request.method == 'GET':
return render(request, 'user/signup.html', {'form': form})
elif request.method == "POST":
form = UserForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password1')
user = authenticate(request, username=username, password=password)
login(request, user)
return redirect('/')
else:
form = UserForm()
return render(request, 'user/signup.html', {'form': form})
어제자 TIL에서 말씀드린 자동로그인 기능을 구현해 왔습니다. 어제 작성했었을 때는 인자를 왜 2개를 주냐며 오류를 뱉었는데 이는 login
함수를 작성하며 내장함수의 login
을 받아와야하는데 제가 작성한 login
함수를 받는 것이 문제였습니다.
이를 수정하기 위해 작성한 모든 함수 뒤에 _view
를 붙혀주기로 하였습니다. 헌데 더 이상 로그인함수가 존재하지 않으니 무의미해졌지만 기능을 추가하며 다시 일어날 수 있는 일이라 생각해 그대로 두었습니다.
post
로 가져온 폼이 is_valid
함수를 통과해 True
가 반환된다면 폼을 저장하고 해당 폼을 그대로 user
에 집어넣어 user
를 로그인시킨후 메인화면으로 보내주었습니다.