<후기>
- 2주차는 내용을 정리하기에 너무 많고 시간이 오래 걸릴 것 같아 생략한다
- 겪었던 시련 위주로 일지를 작성해보고자 한다
<오류>
1번째 시련: 데이터베이스 연결하기
- 데이터베이스 탭에서 Data Source from Path를 눌러서 장고가 생성한 db.splite3을 선택하는 것까지는 잘 됐다
- 그 다음 연결에 필요한 드라이버를 설치하는데 노트북이 렉걸려서 그만 설치를 못했다...
- 그대로 파이참을 강제종료하고 다시 들어가서 드라이버를 설치하는 데까지는 또 성공을 했다
- 근데 무슨 switch 어쩌고 창이 떴다...
- 영어를 모르는 게 죄지....다시 껐다가 켜도 떴다...
- 왠지 눌러보고 싶게 switch가 버튼처럼 생겨서 눌렀다
- 그러고 Test Connection을 누르니 허무하게도 그냥 연결이 잘 됐다^^!
- 사실 이건 시련 축에도 못 낀다
2번째 시련: admin 페이지 TypeError
- 또 튜터님이 하라는 대로 장고 서버를 실행시키고 http://127.0.0.1:8000/admin 여기로 접속을 했다
- 일단 구글에 'set' object is not reversible 라고 검색했다
- 여러 페이지를 둘러봤는데 나에게 맞는 정보가 없었다
- 결국 튜터님을 찾아갔다 화면공유를 했는데 튜터님이 직접 파일을 봐야 할 것 같다고 하셔서 파일을 압축해서 보내드렸다
- 튜터님이 해내셨다!
- urls.py 파일 안에
urlpatterns = {
path('admin/', admin.site.urls),
path('test/', views.base_response, name='first_test'),
path('first/', views.first_view, name='first_view'),
}
- 이 부분이 있는데 []로 감싸져야 하는 게 {}로 감싸져 있어서 그런 것이라고 하셨다
- 튜터님이 말씀하신 대로 {}를 []로 바꾸니 admin 페이지가 잘 나온다!
- 근데 사실 내가 찾아본 페이지 중에 튜터님이랑 똑같이 얘기한 사람이 있었다
- 근데 내가 에러에 지쳐있어서 눈여겨보지 않았다....
- python - TypeError at /admin/ 'set' object is not reversible and argument( ) to reverse must be a sequence - Stack Overflow
- TypeError: 'set' object is not reversible · Issue #781 · axnsan12/drf-yasg (github.com)
- 심지어 2군데서 봤다 저 얘기를....근데 뭔소린지도 모르겠고...해서 넘겼는데....저게 답이었다
3번째 시련: superuser 계정 삭제
- 이건 사실 시련까지는 아니고 강의 내용 외에 내가 알고 싶어서 찾아봤다
- 왜냐하면 superuser 계정을 만들 때 비밀번호가 안 보여서 이게 뭐야! 하고 막 쳤는데 그게 그대로 계정이 생성되어버려서...ㅎㅎ....
- 근데 비밀번호 바꾸는 법 찾아볼 생각을 안 하고 계정을 하나 더 만들었다 그래서 처음 만든 계정을 삭제하고 싶어져서 찾아봤다
- 구글에 django superuser 삭제 라고 검색했다ㅋㅋ
- 장고(django)에서 superuser를 삭제하는 방법. : 네이버 블로그 (naver.com)
- 여기서 삭제하는 방법을 잘 알려줬다
- 하라는 대로 삭제 명령어까지 썼는데 저기에서 나가지지가 않는 게 또 문제.......
- 뭐지 싶어가지고 블로그를 다시 봤는데 맨 마지막에 exit가 있어가지고 ㅋㅋㅋ그대로 따라 썼다
- 그랬더니 나가지는 게 아니라 나가는 방밥을 알려준다
- 컨트롤z 했는데도 아무 반응이 없길래 3번이나 씀 ㅋㅋㅋ
- 근데 컨트롤z 하고 엔터 누르면 되는 거였다 어렵구만~
참고: superuser 계정 비밀번호 변경하는 방법
- 처음에 바꿀 비밀번호를 썼는데 너무 짧다그래서 당황해서 아무거나 썼다가 2번째 again이랑 안 맞다고 넘어감ㅋㅋ
- 다시 제대로 비밀번호를 설정하고 엔터 눌렀더니 끝!
- 비밀번호 변경 명령어: python manage.py changepassword <유저이름>
4번째 시련: 관리자 계정 로그인 오류
- 어제 했던 거에 이어서 강의를 들으려고 파이참을 실행시키고 강의에서 하라는 대로 서버 실행 시켜서 로그인창까지는 잘 띄웠다
- 근데 자꾸 아이디나 비밀번호가 맞냐는 경고문이 뜨는거다......
- 그래서 어제 배웠던 대로 계정 삭제도 했다가 계정 새로 생성했다가 비밀번호도 바꿔봤다가 난리를 쳤다
- 매니저님 찾아가서 여쭙기도 하고....같이 고민해주셨는데
- 문득 떠오른 생각....'vscode에서 서버 실행시키고 있어서 안 되나....?'
- vscode로 장고 프로젝트 설정하고 서버도 실행시킨 다음에 서버 종료해야 한다는 생각을 못 하고 바로 파이참을 켜서 서버를 실행시킨거다.....
- 먼저 실행된 vscode 장고 서버에는 관리자 아이디가 없으니 로그인이 안 됐던 것이었다....
- vscode에서 서버를 종료시키고 다시 로그인을 시도하니 로그인이 됐다.....
- 허무하넹...
5번째 시련: 회원 로그인 기능 만들기
- 강의랑 똑같이 따라했다고 생각했는데 강의는 로그인성공! 창이 뜨고 나는 아래와 같은 에러가 떴다..
- 이젠 뭐 당황하지도 않고 그냥 오류 문구 복사해서 구글에 검색한다
- django - 'WSGIRequest' object has no attribute 'get' - Stack Overflow
- 나를 구원해준 멋진 답변자...
- 다행히 질문자가 나랑 같은 실수를 범했다
username = request.get('username', None)
password = request.get('password', None)
- 가운데 POST가 빠짐...ㅋㅋㅋ
username = request.POST.get('username', None)
password = request.POST.get('password', None)
- 이렇게 수정해주니 로그인이 잘 됐다!!
<숙제>
1. 회원가입 시 중복ID 막는 기능 추가
- 문제를 읽었을 때 회원가입 시 패스워드와 패스워드 확인이 일치하지 않으면 회원가입페이지를 반환했던 걸 떠올렸다
- 그리고 로그인 할 때 데이터베이스에 있는 이름과 회원이 입력한 이름이 일치하는지 판별하는 코드도 생각났다
me = UserModel.objects.get(username=username)
if me.password == password:
request.session['user'] = me.username
return HttpResponse(me.username)
- 이 부분이다
check_username = UserModel.objects.get(username=username)
if password != password2:
return render(request, 'user/signup.html')
elif check_username.username == username:
return render(request, 'user/signup.html')
else:
new_user = UserModel()
new_user.username = username
new_user.password = password
new_user.bio = bio
new_user.save()
- 이렇게 코드를 짰고 실제로 회원가입 할 때 이미 가입한 이름으로 하니까 페이지가 리로드되는 걸 확인했다
- 근데 정답인지 아닌지 확신은 없어서 답안을 봤는데 조금 달랐다
if password != password2:
return render(request, 'user/signup.html')
else:
check_username = UserModel.objects.filter(username=username)
if check_username:
return render(request, 'user/signup.html')
else:
new_user = UserModel()
new_user.username = username
new_user.password = password
new_user.bio = bio
new_user.save()
- 일단 데이터베이스에서 가져올 때 get이 아니라 filter를 쓰는 게 달랐다
- 구글에 django get filter 차이 라고 검색했다
- get()은 조건에 해당하는 object, 1개의 row를 반환하고, filter()는 조건에 해당하는 여러 row를 모두 묶어 QuerySet이라는 형태로 반환한다([django] get(), 그리고 filter() (velog.io))
- 무슨 말인지 몰라서 하나 더 찾아봤다
- get()은 MultipleObjects 혹은 DoesNotExist exception 에러를 반환하고, filter()는 새로운 쿼리셋을 생성 후, 필터 조건에 부합하는 객체들을 넣은 후 반환함(즉, 필터 조건에 부합하는 객체들이 하나도 없을 시 에러메시지가 아닌 빈 쿼리셋을 반환함)([샤넬 프로젝트] filter()와 get()의 차이(장고) (velog.io))
- 뭔가 알 듯 말 듯 하여 직접 실행해보았다
- 처음에 코드 잘 되는지 확인할 때는 데이터베이스에 있는 이름을 넣어서 에러가 안 뜬 거였고 데이터베이스에 없는 새로운 이름을 넣으니까 아래와 같은 에러가 떴다
- 몸소 겪으니 완전히 이해됐다!!
2. 로그인 성공 후 나오는 페이지에 회원이름 띄우기
- 이건 문제 보자마자 알았다 완전 간단함
me = UserModel.objects.get(username=username)
if me.password == password:
request.session['user'] = me.username
return HttpResponse("로그인 성공!")
else:
return redirect('/sign-in')
- 이게 원래 코드인데 "로그인 성공!" 자리에 me.username 으로 바꾸면 된다
- 근데 난 사실 다르게 생각하고 아래처럼 적었다
return HttpResponse(f"{me.username} 로그인 성공!")
- 이건 뭐 틀렸다고 할 수 없는 듯??ㅋㅋ
- 근데 답안지는 아래처럼 생겼다
me = UserModel.objects.get(username=username)
if me.password == password:
request.session['user'] = me.username
return HttpResponse(me.username)
else:
return redirect('/sign-in')