- 코드리뷰
- 커밋, 코드 컨벤션
- 머신러닝 1주차
- 코드리뷰하고 유지보수하며 커밋 코드컨벤션 연습하기
- 깃에 커밋하기
- 주말에 공부할 것 계획짜기
코드리뷰를 하면서 장고를 전체적으로 이해하는 시간을 가졌다. live share를 이용해서 팀원분들과 각자 주석을 달고 서로 설명하는 시간을 가졌는데 주석을 달아서 괜찮다고 생각한 점은 개발자가 어떤생각을 하면서 코드를 입력했는지 알 수 있어서 이해하는데 큰 도움이 되었고 공부도 되었다. 그리고 혼자서 봤을때 시간을 투자하면 내 코드로 만들 수 있어서 좋았다. 머신러닝 수업을 들었는데 흥미로웠다 선형회귀를 실습하는 시간을 가졌는데 금토일 연휴를 이용해서 조금 더 공부하고 싶다는 생각을 했다. 하지만 무엇보다 지금은 장고를 그중에서도 프론트가 아닌 백엔드, 데이터 베이스쪽 공부를 더 탄탄하게 해서 궁극적인 목표인 백엔드 개발자의 길을 걸어야 한다고 다시 다짐했다. 주말에 우선적으로 파이썬 복습과 장고 복습을 통해서 기본기를 다지고 준비가 된다면 알고리즘, 자구, 머신러닝을 공부할 예정이다.
오늘 공부한 것 중에 제일 의미있는 프로젝트 회고와 코드리뷰를 작성해볼까 한다. 또 유지보수를 하면서 내가 왜 이런코드를 작성했는지 이때 사용한 코드를 더 깔끔하게 할 수는 없을까 생각하면서 더 깊이 공부 할 수 있었다.
유저정보 업데이트 함수를 만들고 코드리뷰를 통해 더 나은 코드를 만들 수 있었다.
###user_update## 코드수정 전
@login_required
def update(request):
# get 요청시 페이지를 보여준다.
if request.method == 'GET':
return render(request, 'user/update.html')
elif request.method == 'POST':
# 요청한 유저를 user로 정해준다.
user = request.user
bio = request.POST.get('bio')
email = request.POST.get('email')
username = request.POST.get('username')
nickname = request.POST.get('nickname')
# filter 를 활용해서 가져온 인스턴스와 입력한 인스턴스를 비교하는 변수를 만들어준다.
exist_nickname = get_user_model().objects.filter(nickname=nickname)
exist_username = get_user_model().objects.filter(username=username)
# 닉네임은 중복이 불가한 컬럼이다. 회원정보 수정시 원래 닉네임과 같으면 변경이 안되는 걸 막기위한 코드다.
# TODO
if (exist_nickname and user.nickname == nickname) and (exist_username and user.username == username):
user.nickname = nickname
user.bio = bio
user.email = email
user.username = username
user.save()
return redirect('/', user.username)
# 입력한 닉네임과 db에 저장되어있는 닉네임이 중복되고 내 닉네임과 다르다면 에러창을 띄운다.
elif exist_nickname and user.nickname != nickname:
return render(request, 'user/update.html', {'error': '이미 사용중인 nickname 입니다.'})
elif exist_username and user.username != username:
return render(request, 'user/update.html', {'error': '이미 사용중인 username 입니다.'})
# 이게 있어야 하는지 의문이다.
else:
user.nickname = nickname
user.bio = bio
user.email = email
user.username = username
user.save()
return redirect('/', user.username)
###user_update## 코드수정 후
@login_required
def update(request):
# get 요청시 페이지를 보여준다.
if request.method == 'GET':
return render(request, 'user/update.html')
elif request.method == 'POST':
# 요청한 유저를 user로 정해준다.
user = request.user
bio = request.POST.get('bio')
email = request.POST.get('email')
username = request.POST.get('username')
nickname = request.POST.get('nickname')
# filter 를 활용해서 가져온 인스턴스와 입력한 인스턴스를 비교하는 변수를 만들어준다.
exist_nickname = get_user_model().objects.filter(nickname=nickname)
exist_username = get_user_model().objects.filter(username=username)
# 닉네임은 중복이 불가한 컬럼이다. 회원정보 수정시 원래 닉네임과 같으면 변경이 안되는 걸 막기위한 코드다.
# TODO
# 입력한 닉네임과 db에 저장되어있는 닉네임이 중복되고 내 닉네임과 다르다면 에러창을 띄운다.
if exist_nickname and user.nickname != nickname:
return render(request, 'user/update.html', {'error': '이미 사용중인 nickname 입니다.'})
elif exist_username and user.username != username:
return render(request, 'user/update.html', {'error': '이미 사용중인 username 입니다.'})
# 이게 있어야 하는지 의문이다.
else:
user.nickname = nickname
user.bio = bio
user.email = email
user.username = username
user.save()
return redirect('/', user.username)
유저 업데이트 함수 수정 전 후 를 비교할 수 있다. 팀원끼리 정한 컨벤션인 #TODO 아래쪽을 보면 마지막의 else와 중복되는 부분이 있어서 불필요한 코드라고 생각을 했고 삭제 후 테스트를 통해서 마지막 else에서 저장을 해도 되는 것을 확인했다.
지워진 부분
if (exist_nickname and user.nickname == nickname) and (exist_username and user.username == username):
user.nickname = nickname
user.bio = bio
user.email = email
user.username = username
user.save()
return redirect('/', user.username)
비밀번호 변경 함수를 만들어 보았다.
@login_required
def change_password(request):
if request.method == "POST":
# 요청유저 인식
user = request.user
origin_password = request.POST["origin_password"]
#장고가 제공한 기능을 통해서 현재 비밀번호와 신규 비밀번호를 비교한다.
if check_password(origin_password, user.password):
new_password = request.POST["new_password"]
confirm_password = request.POST["confirm_password"]
#현재 비밀번호와 신규 비밀번호를 비교하고 현재 비밀번호와 신규 비밀번호 확인을 비교하여 오류를 띄워준다.
if origin_password == confirm_password or new_password == origin_password:
return render(request, 'user/change_password.html', {'error': '사용하고 있는 비밀번호를 입력하셨습니다.'})
#새 비밀번호와 새 비밀번호 확인이 같아야 비밀번호를 저장한다.
elif new_password == confirm_password:
user.set_password(new_password)
user.save()
auth.login(request, user,
backend='django.contrib.auth.backends.ModelBackend')
return redirect('/')
else:
return render(request, 'user/change_password.html', {'error': '신규 비밀번호와 신규 비밀번호 확인을 똑같이 입력해주세요.'})
else:
return render(request, 'user/change_password.html', {'error': '현재 비밀번호가 틀렸습니다.'})
else:
return render(request, 'user/change_password.html')
로그인 함수 이메일을 입력했을때 일치하는 이메일이 없다면 오류가 나는 것을 수정했다.
### 로그인 ###
def login(request):
if request.method == 'GET':
return render(request, 'user/login.html')
elif request.method == 'POST':
# 이메일 양식 체크
check_email = re.compile(
'^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')
email = request.POST.get('email', None)
password = request.POST.get('password', None)
check_email = check_email.match(email)
if check_email is None:
return render(request, 'user/login.html', {'error': '이메일 양식이 올바르지 않습니다.'})
# 입력란 빈칸일때
if email == '':
return render(request, 'user/login.html', {'error': '메일을 입력해주세요.'})
elif password == '':
return render(request, 'user/login.html', {'error': '패스워드를 입력해주세요.'})
# 이미 존재하지 않는 이메일로 로그인을 시도했을때 에러 띄우기
exist_email = get_user_model().objects.filter(email=email)
if exist_email:
pass
else:
return render(request, 'user/login.html', {'error': '유저 정보를 찾을 수 없습니다.'})
username = UserModel.objects.get(email=email.lower()).username
# User 인증 함수. 자격 증명이 유효한 경우 User 객체를, 그렇지 않은 경우 None을 반환
user = auth.authenticate(request, username=username, password=password)
if user is not None:
auth.login(request, user) # 로그인 처리
user = request.user
print(user.nickname, user, user.username)
return redirect("/")
else:
print('로그인 실패')
return render(request, 'user/login.html', {'error': '유저 정보를 찾을 수 없습니다.'})
# 이미 존재하지 않는 이메일로 로그인을 시도했을때 에러 띄우기
exist_email = get_user_model().objects.filter(email=email)
if exist_email:
pass
else:
return render(request, 'user/login.html', {'error': '유저 정보를 찾을 수 없습니다.'})
username = UserModel.objects.get(email=email.lower()).username
코드를 추가하면서 에러가 나는 경우의 수를 처리해줬다.
'TIL' 카테고리의 다른 글
pybo | github 연습 | 거북이반 1일차 정리 (0) | 2022.10.12 |
---|---|
WIL | 파이썬 심화 복습 | 장고 복습 | 프로젝트 끝 (0) | 2022.10.09 |
TEAM_B3 instagram PROJECT | 코드리뷰 준비 | project management 특강 | 자가진단, 피드백 후 계획 | (0) | 2022.10.06 |
Django Project | 회원 정보 수정 | 비밀번호 변경 | (0) | 2022.10.06 |
Django 인스타 클론코딩 프로젝트 | 좋아요, 북마크 | 회원정보수정 | 이메일 인증 비밀번호 재설정 | (0) | 2022.10.05 |