<후기>
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 페이지가 잘 나온다!
admin 로그인 페이지
근데 사실 내가 찾아본 페이지 중에 튜터님이랑 똑같이 얘기한 사람이 있었다
근데 내가 에러에 지쳐있어서 눈여겨보지 않았다....
ㅎㅎ...
ㅎㅎㅎㅎ...
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번째 시련: 회원 로그인 기능 만들기
강의랑 똑같이 따라했다고 생각했는데 강의는 로그인성공! 창이 뜨고 나는 아래와 같은 에러가 떴다..
이젠 뭐 당황하지도 않고 그냥 오류 문구 복사해서 구글에 검색한다
username = request.get('username', None)
password = request.get('password', None)
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')