2025/11/09 Django - 3

김기훈·2025년 11월 9일

TIL

목록 보기
50/191

오늘 학습 내용

Blog

가상환경 설정 및 포에트리,장고 설치

  • poetry add django == 5.0.4 : 버전 고정 설치
    • poetry add django ~= 5.0 : 5.0버전에서 최신버전 설치
  • pyenv virtualenv 3.12.1 oz_blog
    • 새로운 가상 환경 생성
      • pyenv local oz_blog
        • oz_blog 가상환경을 활성화
  • poetry init : poetry 설정 / poetry add django : django 설치

Django 설정

  • django-admin startproject config .

    • django 설정파일 생성 / . 은 현재 경로에서 파일을 만들겠다는 의미
  • Languages & Frameworks에서 Django도 설정

  • poetry add ipython

    • python manage.py shell
    • ipython — 더 똑똑한 파이썬 쉘
    • 기본 Python shell 보다 기능이 훨씬 많아서 장고 shell에서 테스트할 때 매우 편함
  • poetry django-extensions

    • Django 개발 보조 확장: Django 개발 시 편리한 명령어들을 추가해줘서 생산성이 올라감
    • python manage.py shell_plus
      • 자동 import shell
      • 모든 models 자동 불러오기 (매번 from app.models import User 안 해도 됨)
    • python manage.py show_urls
      • URL 목록 보기
    • python manage.py graph_models -a -o erd.png
      • 모델 구조 그림으로 만들기 = ERD 이미지 생성

마이그레이션

  • python manage.py migrate
    • Django 프로젝트에서 필요한 데이터베이스 테이블을 생성하고, 데이터베이스 구조를 초기화
    • runserver 했을때 뜨는 빨간색 경고 없어짐

  • python manage.py makemigrations
    • 마이그레이션 파일 생성(git 의 commit 느낌)
  • python manage.py migrate
    • db에 적용 (git 의 push 느낌)

블로그 목록 페이지 만들기

admin

  • python manage.py createsuperuser

  • getcategory_display = get컬럼명(choices를 만든)_display()
    • 원래는 [free] 가 나와야 하지만 [자유] 가 나오도록 변경
  • def str(self)
    • 원래 제목이 기본적인 영어 제목이 되어야 하지만 제목의 노출형식을 설정
  • 'choices=' 이거 때문에 CharField 임에도 선택박스가 나오는 것


블로그 상세 페이지 만들기

  • get_object_or_404: 없는 아이디값을 출력하면 404 반환

사용하기 편하게 개선 = 동적으로 만들기

  • <a href="{% url 'blog_detail' blog.pk %}">
    • url이라는 템플릿 함수가 django urls.py에서 이름이 blog_detail을 가진 path를 찾음
      • 이 이름에 맞춰서 url경로를 맞춰줌
    • blog.pk
      • 꼭 이름이 pk가 아니라 id여도 가능, 이름으로 받는게 아니라 위치인자로 받음
      • path('blog/<int:pk>/', views.blog_detail,name='blog_detail')
        • 여기서 첫번째 인자로 들어오는 숫자를 그냥 blog.pk가 받는것

  • 추가로 받는 값이 없기 때문에 <a href="{% url 'blog_list' %}">

쿠키와 세션

  • 사용자 식별, 행동 정보 기억을 위해 필요
  • 매번의 요청은 독립적인 사건이기 때문에 기억해야할 정보를 함께 요청하는 작업이 필요

쿠키

  • 유저단에 정보 저장 (클라이언트)
  • 텍스트
  • 브라우저에 저장되기 때문에 외부 유출에 취약
  • 보안등급이 높은 정보는 쿠키에 저장할 수 없음
  • 종료 시점을 설정할 수 있고, 미설정 시 브라우저 종료와 동시에 쿠키도 소멸됨
  • 한 도메인당 20개, 쿠키 하나당 4KB로 총 300개의 용량 제한이 있음

세션

  • 보안상 브라우저에서 갖고 있을 수 없는 중요 정보를 저장할 수 있다.
  • 서버에 저장됨
  • 서버는 쿠키가 가진 key와 매핑된 value를 딕셔너리 형태로 저장. (Object형)
  • 브라우저가 쿠키의 key로 요청을 하게되면 서버에서는 key를 가지고 유저의 세션 정보를 파악할 수 있음
  • 정확한 소멸 시점을 알 수 없음
  • 서버가 허용하는 선에서 용량 제한이 없음

실습

  • visits = int(request.COOKIES.get('visits',0)) +1
    • get
      • visits값을 key값으로 가져오고 Key값이 None일 경우에 디폴트로 지정해준 0을 사용
    • return 되는 값이 str이기 때문에 int로 변환

로그인 페이지 만들기

Django Authentication 공식문서

  • 로그인 정보는 보안이 중요하기 때문에 세션에 저장

    • Django에 내장되어있는 Django Authentication을 이용하여 실습 예정
  • accounts의 기능들

  • admin 페이지에서 만든 superuser로 로그인 함

  • csrf

    • 클라이언트와 서버가 공유하는 인증값이 담긴 보안용 토큰
    • settings.py의 MIDDLEWARE에 설정되어있어 모든 Post에서 CSRF 토큰을 검증
    • crsf 토큰을 주지 않으면 검증에 실패하여 Post 요청이 들어가지 않음
  • username을 보여주는 코드를 추가하여 로그인이 잘 되었는지 확인


로그아웃 페이지 만들기

Signup 페이지 만들기

  • app는 모듈화가 가능하도록 만들어야 하기 때문에 회원가입 관련 App 생성
    • python manage.py startapp member

  • 비밀번호 정책이 이미 settings에 존재하고,

    • form = UserCreationForm(request.POST)
      • Form에 request.POST를 넣어주면 자동으로 validation 됨
  • 정책을 통과하면 로그인창으로 넘어가고 회원가입한 아이디로 로그인도 가능

  • 회원가입 버튼 만들기

코드 단순화

  • form = UserCreationForm(request.POST or None)

    • post일 경우 post데이터가 들어가고 아닐경우 none데이터가 들어감
  • from django.conf import settings

    • 장고가 실행되고 있는 환경에서 settings파일을 가져옴
    • 만약 config폴더의 이름이 변경되더라도 알아서 찾아서 가져옴
  • from config import settings

    • 폴더에 있는 그대로 가져온 것

Mini Project. Login 기능 직접 만들기

  • redirect(reverse('blog_list'))
    • from django.urls import reverse
      • reverse: 이름을 가지고 어떤 url로 갈지 찾아줌
      • config/urls.py 에서 blog_list라는 이름을 가진 url을 찾고 redirect

새로운 지식

  • templates/blog_list 이렇게 생성하면 자동으로 폴더까지 생성됨
  • Pycharm에서 모듈을 자동으로 import 하기위해서 : option + Enter

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

  • views.py / blog_list.html / urls.py 세팅 다하고 열어봤는데 오류발생

    • 원인: settings에서 기본적으로 등록을 해놓지 않으면 템플릿 경로를 찾지 못함
    • 해결1: 'DIRS': [BASE_DIR / 'templates']
  • 해결2: 'APP_DIRS': True 만든 app안에 templates가 있으면 그것을 사용 하겠다.

    • blog안에 templates를 만들고 templates안에 폴더를 하나 만들어야 함
profile
안녕하세요.

0개의 댓글