[장고기초] 2주차

2022. 9. 23. 12:55스파르타코딩클럽[AI트랙 3기]/장고

2-1 2주차 이번주 배울 것

[수업목표]

1.장고 구조를 알아보고 필요한 기초명령 익히기

2.orm을 알아보고 datebase와 연동

3.admin의 기능 알아보기

4.사용자 모델을 만들고 사용자 관리 기능을 구현(회원가입/로그인)

 

2-2 프로젝트 구조 만들기

1)장고가 일하는 순서

주로 코딩할 부분은 url view

url은 사용자가 특정 주소로 접근할 수 있도록 정해주는 것

viewurl에서 어떤 역할, 기능을 수행할 것인지 만들어 주는 것

2)프로젝트 구조 만들기

크게 세가지로 나뉨. 사용자관리(회원가입,로그인,로그아웃)/ 글쓰기 /친구만들기

다시 크게 보면 글과 사용자로 나눌 수 있는데 이것을 프로젝트 하나씩 수정.

*alt + f12 = > 터미널 창 열기 

명령어: 장고 어드민 user > 사용자 관리 / tweet > 글관련 내용 관리

파이참에서 터미널 눌러줌. 콘솔창 나옴. 위에 장고 어드민 두가지를 적어줌.

명령어엔터치고 아무일 없으면 대부분 실행 잘된거라고 생각하면 됨. 그럼 파일창 보면 tweetuser 라는 앱이 생성됨.

3)프로젝트 세팅하기

앱을 장고가 알 수 있도록 프로젝트 세팅

앱은 3가지가 있음(mySpartaSns, tweet, user)

mySpartaSns의 setting.py를 클릭. 생성한 앱을 세팅안에 추가. allower_host, intaled_apps가 있는데 installedapp‘tweet’,‘user’, 추가해줌.

 

***오류나로 파워셀에서 권한 바꿔줌

 

2-3 데이터베이스와 장고 orm 알아보기

1)장고가 디비에 잘 연결되어있는지 확인하기

>파이참켜서 장고 실행. 재생버튼 누르기. 터미널에 실행되는지 확인. settings.py이상하면 장고 실행 안됨. > 파일탐색기에서 db.squlite3가 있으면 연결 성공.

***OSError: [WinError 123] 파일 이름, 디렉터리 이름 또는 볼륨 레이블 구문이 잘못되었습니다: '<frozen importlib._bootstrap>'라는 오류 나옴. 알고보니 tweet, user사이에' , '빼먹음.

파이참 오른쪽에 데이터베이스 있음. 직접 눈으로 확인하게끔 파이참이 도와줌. 왼쪽 상단에 더하기 버튼 누르면 data source from path(경로) 클릭 > mySparTaSns잘선택되어있는지하고 db.squlit3열기(***여기서 다른 파일선택하면 연결오류남). 드라이버에 sqlite 클릭(이름은 그대로 두기) 밑에 다운로드 드라이버 해줌. test connection 누르면 연결되었는지 체크. 적용확인 > 오른쪽에 데이터베이스생성할때마다 테이블이 생김> 콘솔창은 닫기

2)orm

object relational Mapping은 하나의 데이터베이스를 하나의 객체(object)덩어리로 보고, 데이터베이스를 sql 언어가 아닌 클래스로 쉽게 표현 및 사용할 수 있게 해줌.

 

-1주차 클래스 개념 사용. 클래스 형태 보기

3)usermodel 만들기

장고는 기본적으로 유저모델 제공. 그렇지만 한 번 만들어보자.

사용자를 구분하는 이름, 비밀번호, 상메, 가입일(생성일), 수정일 정보를 class에 담아서 장고에게 알려준다.

user/models 코드스니펫 클릭 > user의 models.py 들어가서 붙여넣기

만들어 준 것을 장고에 알려주기.

4)만든 모델 데이터베이스에 넣기

1.데이터베이스에 변경을 알려주는 명령어( python manage.py migrate) 2.변경된 데이터베이스를 반영해주는 명령어 를 입력 (python manage.py migrate)

정지버튼 눌러서 우선 장고 꺼두기>터미널켜서 명령어 내보내기>장고가 확인했다고 뜸.>잘 됐으면 python manage.py migrate 해주면 많은 내용들이 생성됨.

다시한번 models.py 클래스 확인. 모델 클래스에는 여러정보가 들어가있음. 근데 그 데이터베이스 정보를 메타에 적어줌. 그 중 db_table이라는 속성은 내 테이블 이름이 my_user라는 것이면 좋겠다.

디비창보면 새로고침 있음. 연결되면서 여러 가지 등장. main누르면 우리가 만든 my_user라는 테이블이 있고 그것을 눌러보면 우리가 생성한 것과 같음을 알 수 있다.

 

2-4 장고 어드민 어드민 기능 맛보기

연결된 데이터를 통제하는 것 보기

파이참에서 장고 서버 실행>http파일 눌러주기

처음에는 간단한 페이지 나옴(page not found< 당황하지말자..) 주소창에 주소/admin이라고 하고 엔터

-관리자페이지 접속할 수 있는 계정 생성 필요.

파이참 > 정지 > 터미널열기 > 새로운 명령어 python manage.py createsuperuser하고 엔터치면 유저네임 적기, 이메일, 비밀번호 작성. 성공적으로 만들었다하면 관리자 계정 성공적 생성 완료 > 재생버튼 > 아까 페이지로 다시 가기. 아까만든 계정 입력해주면 관리자 페이지로 들어옴.(이때 비밀번호는 파이참에서도 실행 안됨.)

관리자 페이지의 user에는 superuser이 있음.

우리만의 유저모델 등록하기 > user앱의 admin.py들어가기 > 코드스니펫 user/admin.py 복사 붙여넣기

from .models import UserModel models라는 파이썬 파일에서 그 중에 UserModel을 가져오겠다는 소리임.

admin.site.register(UserModel) :방금 가져온 유저모델을 관리자페이지에 넣겠다.

그럼 웹페이지에 들어와있음.

 

2-5 ORM의 활용과 Admin 익숙해지기

글쓰기 앱, 글쓰기 모델을 만들어서 해보기.

1)tweet 모델 만들기

sns게시글은 작성자, 내용, 글 생성일자, 수정일자

tweet앱에서 실행. tweet/models.py 붙여넣기.

from user.models import UserModel

 

author 이라는 부분은 다른 부분과 다른게 ForeignKey인데 다른 데이터베이스에서 내용을 가져오겠다. 글자를 쓰는것도 아니고, 날짜를 쓰는것도 아니다. 그래서 usermodelfroeignkey 안에 들어가있음.

정지버튼 누르고 > 터미널 켜기

python manage.py makemigrations > 성공메세지

python manage.py migrate.

디비창에서 새로고침 누르면 tweet이라는 창이 생성돼있고 우리가 넣은내용이 다 있는 것을 알 수 있음.

tweet modeladmin에 넣기. tweet안에 admit.py 가서 코드스니펫 붙여넣기. 재생해서 서버충돌 일어나는지 확인. > admin 페이지 들어가기. tweet model이 생성되어있는 것을 볼 수 있음.

 

2-6 사용자 관리와 로그인 화면 띄우기

사용자모델을 조금 사용할것이고 그와 관련된 기술을 개발

html 파일 만들기, 파이썬 파일 추가하기.

1)탬플릿 만들기(html 작성하기)

template > base.html만들기 >코드스니펫 복붙

usersign-in, sign-up 만들기 템플릿>경로>user라고 파일 만들기. 이 안에 signin, signup(html파일 생성)만들고 코드스니펫 붙여넣기

html외에도 {%가 있는데 이것을 장고에서 템플릿 문법임. {%extends ‘base.html’%} 하면 base.html 위에 추가해주겠다는 뜻임.

html 내용을 다 붙여넣었는데 이제 화면에 보여줄 수 있도록 이어주는 url,  url에서 기능을 하도록 도와주는 view,  이 viewtemplate가 연결되는 3가지 부분 작성. template은 이미 다 작성했으니 urlview를 집중해서 작성.

*흐름:

회원가입 url:sign-up

사용자가 url: / sign-up 라고 요청하면 mySprtaSns로 가고 거기안에 있는 urls.py에다가 우리가 추가한 앱 알려주기. 먼저 user앱에 url 추가할거라서 user앱에 오른쪽버튼 파이썬 파일 urls.py 추가. 그럼 user앱의 urlsspratsns urls.py에 알려줌. >myspratsns가서 urls.py 클릭해서 내용 추가(myspartasns에서 urls > from django.urls import path가 있는데 그 뒤에 , include하고 맨밑에 path(‘’,include(‘user.urls’)), > user.urls에서 정의하는 모든 것을 해당파일에서 이해할 수 있음. 여기에 맞는 view를 작성. user앱에서 views.py 해서 붙여넣기. signup, signin 관련함수를 만들었고, 이것을 url과 연결시켜야함. 코드스니펫 복사하고 유저앱의 usrls.py들어가서 붙여녛기. 이제 페이지 가서 주소 맨뒤에 sign-up해주면 회원가입 페이지, sign-in해주면 로그인페이지

화면을 띄우려면 html, url, view를 다 해야함.

 

2-7 사용자관리와 로그인 - 회원가입 기능 만들기

user model 사용한 회원가입 절차 만들기

-회원가입페이지를 보여주는 url은 sign-up, get방식으로 화면을 보여줌.

가입정보를 입력하고 전송하는 url은 동일하게 sign-up하지만 post라는 방식으로 내보냄.

*get/post

get:데이터를읽어오는것(화면보기, 읽기)

post:데이터를 전달하는 것(저장, 수정)

이 속성을 이용해서 회원가입페이지를 두가지로 만듬.

모든 과정은 user와 연관 user의 view.py 를 수정

>파이참 user앱의 views.py > def sign-up view(request): 바로 아래에 if request.method == 'GET': return render(request, 'user/signup.html') => request 메소드가 get이면 화면을 보여주겠다. 하지만 우리가 원하는 것은 post 방식. 그래서 elif 추가. elif request.method == POST:

>이 url에 요청을 하 수 있을만한 화면으로 이동 > templates>user>signup.html 중 form 부분에 주목. form은 화면의 데이터를 서버에 전송할때 많이 사용하는 태그. form에 속성 추가 <form class="form=area" method="post" action="/sign-up/"

우리는 post를 사용(회원가입 정보를 서버로 전달해야함. ) 어떤 url로 전달될지를 적어줘야함(action이라고 적음)

+장고는 보안기능이있는데 이것을 추가해줘야함. 바로 아래줄에 {% csrf_token%}이라고 하는데 장고에서 데이터베이스를 포스트에 보안을 지켜주는 기능. 이제 input과 button에 주목. 정보를 입력하고 마지막에 버튼눌러서 제출.버튼은 form을 실행시켜주는 역할을 함. 우리는 name에 주목해야한다. 각 정보들이 실제로 동작하는 곳은 views.py

>user의 views.py 들어감. form tag에서 sign-up으로 포스트방식으로 데이터를 보냈음. 화면에서 데이터를 받아와서 사용자 모델에 저장해야함. usermodel을 추가해줘야함. 맨위 from .models import UserModel적어주고 elif 밑에 username=request.POST.get('username',None) =>request.POST 하면 POST로 들어온 데이터를 이렇게 받겠다. 그 중 username을 가져올것이고 만약 username 이 없다면 None으로 처리하겠다. 가져온 것을 username이라는 곳에 저장.

나머지 네개정보도 동일하게 작성.

회원가입할때 패스워드2개가 같아야 회원가입이 되게끔 해주기> if password1 != password2: return render(request, 'user/signup.html') <다시한번페이지를 띄워서 입력하게끔

else: new_user = UserModel() #클래스 가져오기 

new_user.suername = username

new_user.password = password #위에 password1이라는 것은 없기때문에 password라고 해줘야함.

new_user.bio = bio

하면 UserModel new_user에는 저장이 됐지만 실제로 데이터베이스에는 저장이 안됐음. 그래서 아래에

new_user.save() #까지해서 데이터베이스에 저장해줌. 저장되고 나서 저장된 다음에는 회원가입 페이지 말고

 로그인 페이지를 보여주고 싶음 > redirect라는 함수 사용. 맨 위에서 render옆에 ,redirect 추가 맨 마지막에  return redirect('/sign-in')을 집어 넣어줌. 

 총정리: sign_up 함수를 실행했을때 GET이면 페이지를 보여주고, POST면 4가지 정보를 request.POST에서 가져옴. 데이터체크 하고 같으면 user정보를 저장, 다르면 회원가입화면 다시 보여줌. 맨 마지막엔 회원가입이 완료되어있는 경우에만 실행됨. 확인> 서버켜기 sign-up들어가기. 들어갈 정보 저장.(작동되는지 확인해보기.)

 

2-8 사용자 관리와 로그인 - 로그인 기능 만들기

user model을 사용한 로그인 절차 만들기

서버, 클라사이에서는 요청과 응답을 함. 그 때 같은 사람이 요청을 하는지 확인할 수 있도록 도와주는 것이 세션. 세션은 사용자의 정보를 저장할 수 있는 공간으로 생각하고 코드를 활용하는법 알아보자. 

1)url, view 세팅하기

user앱의 views.py에 로그인을 처리해줄 함수를 만들고 url과 연결

user의 views.py > sign-in-view 작업 / 제일 상단에 from django.http import HttpResponse 추가(화면에 글자를 띄울때 사용) > 로그인 성공하면 로그인 성공 메세지 띄우기 다시 아래 함수로 돌아감

if request.method == 'POST': return HttpResponse("로그인 성공!")

elif request.method == 'GET':

 return render(request, 'user/signin.html')

2)signin.html 의 form 태그 속성넣기

이제 화면과 연결될 수 있는 signin 페이지로 가서 동일하게 form태그 수정 template에서 signin들어가고 form 태그 

마찬가지로 method="post" action="/sign-in/" *)메소드, 액션 위치는 바뀌어도 상관 없음. 밑에 {% csrf_token %} 추가

3)view의 로그인 작업 마무리하기

다시 views로 돌아가기> if문과 로그인 성공사이에 코드 입력>username = request.POST.get('username',None) password도 동일하게 작성. 그러면 유저 정보가 데이터베이스에 있는지 없는지 확인해줘야함. 엔터두번치고 me = UserModel.object.get(username=username) #유저모델은 이미 데이터베이스와 연결되어있는 객체(클래스) 거기에서 어떤 데이터를 가져올 것인지 조건을 써주면 됨. 왼쪽 username은 우리가 입력한 것아니라 usermodel안에 있는것임. 그래서 데이터베이스에서 각 username이라는 값이 post에서 받아온 데이터와 같은 친구를 불러옴. me는 회원가입한 사용자만 불러옴. me를 통과하려면 데이터베이스 안에 username에 적은 사용자가 있어야함. 

if me.password == password: request.session['user'] = me.username  적어주고  return 로그인 성공을 request.session과 일치하는 선에 넣어줌. 

else: #패스워드가 다르다면 다시 로그인페이지로 연결시킴

return redirect( '/sign-in')

총정리: me에서 if문 중요. me = 이하 < 사용자 데이터베이스에서 username값이 포스트해서 들어온것과 같은 친구를 불러와서 me에 저장. 불러온 me의 패스워드랑 화면에서 입력한 패스워드 같은지 비교하고 만약 같으면 session에 유저 넣기. session은 사용자 정보 저장. 그럼 me.username이 되고 로그인 성공이라고 나옴.

되는지 확인 > 로그인해보기.

id 잘못입력하니까 이런 경고문구 나오면서 제대로 안됨. 어떻게 해결해야하지...

 

DoesNotExist at /sign-in/

 

다른분께서는 try except구문을 이용하라고도 해보셨는데 해결은 되겠지만 내 코드가 안되는 근본적인 이유를 알고싶다.. (경민님 감사합니다!)

>근본적인 이유

내가 하려던 것은 아이디도 없는걸로 했을때 발생하는 오류에 대한 것이었다. 사실 아이디는 바로 입력하고 비밀번호 다르게 입력하면 정상적으로 출력됨. 

그러나 없는 아이디를 입력했을때 다시 로그인 화면으로 나오게 하는 방법을 배웠음.
우선 usermodel에 id값을 추가해줌. 
id = models.AutoField(primary_key=True)
그리고 try except 구문 이용해서 존재하지 않을떄의 경우를 추가해줌.
        try:
            me = UserModel.objects.get(username=username)
            if me.password == password:
                request.session['user'] = me.username
                return HttpResponse("성공!")
            else:
                return redirect('/sign-in')
        except UserModel.DoesNotExist:
            return redirect('/sign-in')

 

2-9 2주차 Wrap up!! & 숙제설명

사이트의 주인될 준비하기. 

숙제)

user앱의 views.py 안에서 모두 해결 가능

1)회원가입 작성시 동일한 유저 이름도 들어갈 수 있음. 동일한 사용자가 회원가입 못하게하기

2)사용자가 로그인 성공 후 httpRespnse를 사용해서 화면에 사용자 이름 출력

 

 

'스파르타코딩클럽[AI트랙 3기] > 장고' 카테고리의 다른 글

[장고기초]4주차  (0) 2022.09.28
[장고기초]3주차  (0) 2022.09.23
[장고 기초]2주차 과제  (1) 2022.09.23
[장고_기초] 1주차 과제  (1) 2022.09.23
[장고 기초] 1주차  (1) 2022.09.23