728x90
반응형

기타


  1. 모델 : 데이터 베이스 지정. 데이터베이스에 어떤 정보를 담을지를 지정한다,.
  2. include : 각각의 앱에서 관리하는 url을 전체 프로젝트에서 관리하기 위해 url을 연결하는 수단
  3. render : 템플릿을 통해 화면을 띄워준다
  4. redirect : 주소값을 받아 다른 곳으로 보낸다. 즉, 다시 url로 보내 그 곳으로 가게 한다.
  5. html은 보이는 부분, views는 로직 담당

 

기본 제공 User모델 업그레이드하기


BEFORE

  1. from django.db import models : 장고의 기본 기능을 사용하기 위해 import
  2. class UserModel(models.Model) : import 해 온 models에 있는 Model 클래스의 기능을 사용하기 위해 상속 사용
  3. bio = models.CharField(max_length=256, default='')와 같이 필요한 정보 작성

💡 모델 수정은 서버 종료 후 하는 것을 권장한다.

 

AFTER

  1. from django.contrib.auth.models import AbstractUser : auth_model 사용 위해 임포트
  2. AbstractUser : 장고에서 제공하는 기본적인 유저 모델을 사용하겠다는 뜻으로, auth_user 테이블과 연동된다.
  3. class UserModel(AbstractUser): : 기본 모델 이외의 추가적인 정보 작성을 위해 AbstractUser를 상속한다. bio = models.CharField(max_length=256, default='') 같이 추가적으로 필요한 정보 추가로 작성
  4. 데이터베이스에 적용하기
    • settings.py의 가장 아래에 AUTH_USER_MODEL = 'user.UserModel' 코드를 추가해준다.
      • AUTH_USER_MODEL : 기본 인증과정. 즉 해당 코드 추가는 기본적인 사용자 모델을 우리가 만든 user앱의 UserModel로 바꾸겠다는 뜻이다.
    • python manage.py makemigrations
    • python manage.py migrate

회원가입시 사용자 유무(가입 여부) 검사


  1. from django.contrib.auth import get_user_model : DB 안에 사용자가 있는지 검사하는 함수 import
  2. exist_user = get_user_model().objects.filter(username=username) : get_user_model 함수를 이용해 데이터베이스에 username을 가진 사람이 있는지 확인
  3. 만약 사용자가 이미 데이터베이스에 존재한다면(if exists_user :) return render(request, ‘user/signup.html’)로 회원가입 페이지를 다시 띄운다.
  4. DB에 사용자 정보가 없다면(else)
  5. UserModel.objects.create_user(username=username, password=password, bio=bio) : 장고의 기능인 create_use() 함수를 통해 유저를 생성하고
  6. return redirect(’/sign-in’) : 로그인 페이지를 로드한다.

로그인 상태로 만들어주기


💡 ✨사전 지식✨ 장고가 자동으로 비밀번호를 암호화하기 때문에 비밀번호를 확인할 때 비밀번호를 비교하기 힘들다. 그래서 인증 기능인 authenticate() 함수를 통해 암호화된 비밀번호와 현재 입력된 비밀번호가 일치하는지, 그 비밀번호가 사용자와 맞는지까지 한 번에 확인해 준다.

  1. me = auth.authenticate(request, username=username, password=password) : 나(me)라는 사용자를 데이터베이스에 검색해서 가져온다.
  2. if me is not None : authenticate가 사용자 정보도 체크해 주고 로그인 정보도 알아서 들고 와서 비밀번호 확인을 해주니까 사용자가 있는지 없는지만 구분해 준다.
  3. auth.login(request, me) : 세션을 지우고 로그인도 장고가 알아서 관리할 수 있도록 코드를 수정해 준다. 괄호 안에는 나의 정보(→request, me)를 넣는다.

흐름만 보기

  1. username과 password를 화면에서 입력 받고, 그 정보를 장고 모듈(→me)에 넣어 준다.
  2. authenticate로 username과 password가 일치하는지 검사해준다.
  3. 검사 완료 후 사용자가 있으면 me라는 변수에 그 사용자를 넣어 준다.
  4. 사용자가 있으면 해당정보를 이용해 로그인 시켜 준다.

로그인 후 보일 페이지 만들기


 💡 ✨기본적인 로직✨ html을 연결할 때 기본적으로 views.py에 render() 함수를 사용하고, 작성한 views.py의 함수를 urls.py에 연결시킨다

 

  1. templates 폴더 안에 tweet 폴더 만들고 그 안에 home.html 만들기
    • {% extends 'base.html' %} : base.html을 기본으로 가져오고, 남는 공간 즉 content라는 공간에다가 코드를 확장해서 작성한다.
  2. 이동 페이지(→home.html)를 연결 할 url과 view를 연결해야 하는데, views 먼저 작업
    • from django.shortcuts import render에서 추가적으로 redirect를 import한다.
    • user = request.user.is_authenticated : is_authenticated는 장고가 제공하는 사용자 모델을 사용했을 때 쓸 수 있는 함수로, 사용자가 인증을 받았는지, 즉 로그인이 되었는지 검사해준다.
    • if user : : 만약 로그인 된 사용자라면
    • return : redirect(’/tweet’) : /tweet이라는 url 주소로 다시 보내준다.
    • else : return redirect(’/sign-in’) : 로그인이 안 됐다면 로그인 페이지를 띄운다.
    • home() 함수에서 사용자의 로그인 여부를 확인하가 로그인 여부에 따라 보여줄 페이지를 나눈다.
    • #tweet 안의 home.html을 보여주는 함수 **def tweet(request): if request.method == 'GET': return render(request, 'tweet/home.html')**
  3. urls.py를 작업해준다.
    • tweet 앱 안에 urls.py 생성
    • # tweet/urls.py from django.urls import path from . import views urlpatterns = [ path('', views.home, name='home'), # 127.0.0.1:8000 과 views.py 폴더의 home 함수 연결 path('tweet/', views.tweet, name='tweet') # 127.0.0.1:8000/tweet 과 views.py 폴더의 tweet 함수 연결 ]
    • Django가 앱 단위에서 urls.py를 생성해 경로를 설정해주고 있음을 알아채고 관리할 수 있도록 처음 만들었던 폴더의 urls.py에 해당 경로를 등록해 주어야 한다.⇒ urlpattenrs 안에 path('', include('tweet.urls')) 추가
    • 참고로 프로젝트와 같이 생성된 settings.py는 프로젝트의 모든 환경설정을 담당하고, urls.py는 프로젝트의 모든 접속 경로를 담당한다.
  4. 로그인 시 ‘로그인 성공’ 글자가 아닌 home.html이 나오도록 user 앱의 veiws.py의 코드를 수정한다.
  5. ⇒ return HttpResponse("로그인 성공") → return redirect('/')
반응형

'Programming > TIL and WIL' 카테고리의 다른 글

220928 Today I Learned (TIL)  (2) 2022.09.28
220927 Today I Learned (TIL)  (0) 2022.09.27
WIL  (1) 2022.09.26
220923, 220924 Today I Learned (TIL)  (0) 2022.09.24
220922 Today I Learned (TIL)  (1) 2022.09.23

+ Recent posts