[TIL #19] 장고 팀프로젝트 #2

안떽왕·2023년 4월 12일
0

Today I Learned

목록 보기
19/76

로그인

먼저 로그인과 로그아웃은 모두 함수로 구현을 해놨었습니다. 그러다 어제 로그인과 로그아웃함수를 작성하지 않고 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를 로그인시킨후 메인화면으로 보내주었습니다.

profile
이제 막 개발 배우는 코린이

0개의 댓글