2025/11/14 Django - 8

김기훈·2025년 11월 14일

TIL

목록 보기
55/191

오늘 학습 내용

[인스타그램] 회원가입 및 로그인 기능 만들기

DB 구조 및 기능

기본 세팅 및 가상환경

  • pyenv virtualenv 3.12.1 oz_pystagram : 가상환경 생성

    • pyenv local oz_pystagram : 가상환경 실행
  • poetry init : Poetry 초기화

    • poetry add django : django 설치
  • django-admin startproject config . : 기초 설정 파일을 생성

  • Python Interpreter과 Language & Frameworks > Django 을 설정하여 프로젝트 세팅을 완료


커스텀 유저 만들기

    1. python manage.py startapp member
    1. models.py 에서 AbstracBaseUser 를 상속받아 User를 커스텀
    • AbstractBaseUser
      • Django의 추상 기반 클래스 중 하나로, 비밀번호 및 인증 관련 필드와 메서드만을 제공 하며,
      • 사용자 정의 필드를 추가하여 완전한 User 모델을 구성 가능

  • class UserManager(BaseUserManager):

    • user = self.model
      • class User의 User을 의미
  • class User(AbstractBaseUser):

    • is_active = models.BooleanField(default=False)
      • 활성화 되어있지 않으면 로그인 불가, 기본적으로는 비활성화
      • 이메일이 인증되면 활성화
    • is_admin = models.BooleanField(default=False)
      • 어드민 사이트 들어갈 수 있는 기능
    • user.object.all()
      • object = manager
    • @property
      • 함수인데 클래스 변수처럼 사용가능하게 만들어줌
      • user.is_superuser() 아니라 / user.is_superuser 이렇게 사용 가능하게 해줌
    • def is_staff / def is_superuser
      • is_staff = model.BooleanField(default=False)
      • is_superuser = model.BooleanField(default=False) 처럼 사용도 가능
    1. settings 에 model.User 등록
    • INSTALLED_APPS = ['model',]
    • AUTH_USER_MODEL = 'member.User'
      • 기본적으로 장고의 User이 아닌 member의 User모델을 사용한다고 장고에게 인식 시킴
    1. migrate
    1. 필수 기능 추가 설치
    • poetry add django-extensions
      • settings에 INSTALLED_APPS = [ 'django-extensions' ] 등록
    • poetry add ipython
    1. admin 페이지 확인
    • python manage.py createsuperuser
      • models.py 에서 이메일,비밀번호만 묻게 해놔서 두개만 필요

회원가입 기능 만들기

    1. 정적 데이터를 사용할 수 있도록 static 폴더를 manage.py와 같은 경로에 생성
    • settings.py 에서 설정코드를 추가
      • STATICFILES_DIRS = [ STATIC_DIR, ] : 개발할때 사용
      • STATIC_ROOT = BASE_DIR / '.static_root' : 배포할때 이용
    • 부트스트랩 에서 CSS와 JS 파일을 다운받아 static 폴더에 넣기
    1. forms.py 를 생성하여 회원가입 폼을 커스텀
    • models.py 가 이전이랑 다르게 기본이 username 가 아닌 email
    • from member.models import User / User = get_user_model() 같은 효과
      • get_user_model()
        • settings에 등록한 AUTH_USER_MODEL를 가져오거나 없으면 장고 기본 모델을 가져옴
    1. settings.py 설정 / views.py, base.html, signup.html 작성 / urls.py 설정

    1. 회원가입 페이지 다듬기
  • 에러 처리

    • password common 같은거 뜨게 함
      • class="text-danger" : 오류메세지를 빨간색으로 나오게 함

  • 부트스트랩 디자인 추가

  • 회원가입 성공시 이동할 signup_done.html 작성

    • success_url = reverse_lazy('signup_done')
      • success_url은 reverse 가 아닌 reverse_lazy 필요
  • 페이지 넘어가는거 까지는 가능한데 DB에 아직 저장 안됨

  • success_url = reverse_lazy('signup_done') 대신 form_valid에서 렌더링

    • 이전 코드에서는 회원가입을 하지 않아도 /signup/done가 들어가 졌지만 안되게 변경
      - 이제 회원가입 완료 링크: http://127.0.0.1:8000/signup/

환경변수 관리

  • 환경변수는 민감한 정보를 코드에서 분리하여 노출을 최소화
    • 환경에 따라 설정을 쉽게 변경할 수 있어 코드 수정 없이 다양한 환경에 대응 가능
    • 개발 팀 내에서 동일한 코드를 사용하되, 각자 환경에 맞는 설정을 사용할 수 있어 협업이 원활
      • GitHub에 올릴 때는 .gitignore 파일을 이용하여 푸시하지 않을 수 있음

python-dotenv

  • 파이썬 애플리케이션에서 환경변수를 쉽게 관리하기 위한 라이브러리

    • .env 파일에 저장된 환경 변수를 자동으로 불러와서 파이썬 코드 내에서 사용 가능하게 함
  • 주요기능

    • 환경 변수 관리
      • .env 파일에 환경 변수들을 정의하고, 이를 코드에서 쉽게 불러와서 사용 가능
    • 보안성
      • API 키나 데이터베이스 비밀번호 같은 민감한 정보를 소스 코드에 직접 작성하지 않고
      • .env 파일로 분리함으로써 보안 강화 가능
    • 유연성
      • 개발, 테스트, 프로덕션 환경 간의 설정 차이를 쉽게 관리
  • 사용 예시

    • 설치: pip install python-dotenv
    • .env 파일 생성: 프로젝트 루트에 .env 파일을 생성하고, 환경 변수를 작성
      • DATABASE_URL=postgres://user:password@localhost:5432/mydatabase
      • SECRET_KEY=mysecretkey
  • 파이썬 코드에서 사용

from dotenv import load_dotenv
import os

load_dotenv()  # .env 파일의 환경 변수를 불러옵니다

database_url = os.getenv('DATABASE_URL')
secret_key = os.getenv('SECRET_KEY')

print(f"Database URL: {database_url}")
print(f"Secret Key: {secret_key}")

config_secret

  • .config_secret
    • 디렉토리를 생성해서 환경변수를 관리: 민감한 정보를 안전하게 보관하고 코드와 환경 설정을 분리 쉬움
  • secret.json
    • json 형태로 정보를 관리: 여러 개의 DB를 한 곳에 묶거나의 방식을 통해 관리가 용이
    • 이 때는 파일을 읽어와서 json.loads 라는 명령어를 통해서 json string을 dictionary 형태로 바꿔 사용 가능
  • 사용 예시
import os
import json

# 현재 환경을 지정 (보통 환경 변수로 지정하거나 기본 값을 사용)
current_env = os.getenv('ENV', 'development')

# 해당 환경의 secret.json 파일 경로 설정
secret_file = os.path.join('config_secret', f'{current_env}.json')

# secret.json 파일 로드
with open(secret_file) as f:
    secrets = json.load(f)

# JSON 데이터를 사용해 환경 변수를 설정합니다.
DEBUG = secrets['DEBUG']
DATABASE_URL = secrets['DATABASE_URL']
SECRET_KEY = secrets['SECRET_KEY']

print(f"DEBUG: {DEBUG}")
print(f"DATABASE_URL: {DATABASE_URL}")
print(f"SECRET_KEY: {SECRET_KEY}")

이메일 인증 기능 만들기

  • 이메일 SMTP(Simple Mail Transfer Protocol) 설정

    • 애플리케이션에서 이메일을 보내기 위해 사용하는 방법
    • SMTP 서버를 통해 이메일을 발송할 수 있도록 설정하는 과정
  • SMTP 설정에 필요한 정보

    • 일반적으로 이메일 발송을 위해 아래와 같은 정보가 필요
      • SMTP 서버 주소
        • 이메일 서비스를 제공하는 서버의 주소 (예: smtp.naver.com)
      • SMTP 포트 번호
        • 서버가 사용하는 포트 번호 (TLS 사용 시 보통 587, SSL 사용 시 465)
      • 이메일 주소
        • 발신자 이메일 주소
      • 이메일 비밀번호 또는 앱 비밀번호
        • 해당 이메일 계정의 비밀번호. 보안상의 이유로 앱 비밀번호를 사용하는 것이 권장됨.
      • TLS/SSL 사용 여부
        • 이메일 전송 시 암호화할지 여부
  • SMTP 설정방법(NAVER 기준)

네이버 SMTP 이메일 보내기 필수 설정 2가지

  • 네이버 메일 환경설정에서 "IMAP/POP3 사용"을 켜야 함

  • 네이버 SMTP는 반드시 “앱 비밀번호(2단계 인증)” 사용해야 함

  • SMTP 서버 설정

    • EMAIL_HOST = 'smtp.naver.com' ( SMTP 서버 주소 (naver 예시))
    • EMAIL_USE_TLS = False ( TLS 사용 여부)
    • EMAIL_PORT = 465 ( TLS 포트 번호)
    • EMAIL_USE_SSL = True
      • ( SSL을 사용하는 경우 True로 설정하고, EMAIL_PORT는 465로 변경)
  • 이메일 계정 설정

    • EMAIL_HOST_USER = 'your_email@naver.com' ( 발신자 이메일 주소)
    • EMAIL_HOST_PASSWORD = 'your_password' ( 이메일 비밀번호 (또는 앱 비밀번호))
  • 기본 발신자 이메일 주소

    • DEFAULT_FROM_EMAIL = 'your_email@naver.com'
In [1]: from django.core.mail import send_mail

In [2]: title = '제목임'

In [3]: message = '이것은 내용입니다'

In [4]: from_email = settings.EMAIL_HOST_USER

In [5]: to_email = ['nike000112@naver.com']

In [6]: send_mail(title, message, from_email, to_email)

실제 입력해보기


이메일 인증 기능 만들기 2


Login, Logout 기능 만들기

  • authenticate
    • Django의 기본 인증 메서드로, 주어진 자격 증명(이메일과 비밀번호)으로 사용자를 인증
    • 인증 성공 시 User 객체를 반환하며, 실패 시 None을 반환
  • LoginForm
    • forms.Form을 상속받아 사용자 로그인에 필요한 폼을 정의합니다. 폼은 이메일과 비밀번호를 입력받으며, 각각의 필드에 대한 위젯과 검증 로직을 포함하고 있습니다.
  • class LoginForm(forms.Form)

    • required = True : 무조건 입력을 받겠다
  • forms.py 에 코드를 추가함으로써 form_valid를 간략하게 줄일 수 있음

  • login페이지 만들기

  • logout 페이지 및 디자인 다듬기

새롭게 알게된 내용

  • 암호화
    • qwer1234 -> dwafawfaf -> 복호화 -> qwer1234
  • 해시화
    • qwer1234 -> dwafa / wfaf -> 암호화(dwafa) -> 암호화 반복 -> 복호화 불가능
      • SHA256
  • cmd + / = 주석 만들기

어려운 내용(추가 학습 필요)

  • 이메일 인증 기능 만들기

오늘 발생한 문제(발생 했다면)

  • SMTP 메일 발송이 안되었음
    • 일반비밀번호로는 불가능
    • 무조건 2차 인증 앱 비밀번호로 해야 통과되었음
profile
안녕하세요.

0개의 댓글