Django 002 | 공식문서 따라하기 #2

This Is Empty.·2021년 9월 8일
0

Django

목록 보기
2/20
post-thumbnail

🔗 Django 001 | 공식 문서 따라하기 #1에 이어서 작성된 포스트입니다.
🔗 첫 번째 장고 앱 작성하기, part 2 공식문서를 따라하며 작성된 글입니다.

첫 번째 장고 앱 작성하기, part 2

  • 데이터베이스 설치
  • 모델 생성
  • Django 관리자 사이트 소개

데이터베이스 설치

python은 기본적으로 SQLite를 제공하기때문에 별도의 데이터베이스를 설치할 필요가 없다.

❗️ 공식문서의 내용은 SQLite를 기반으로 작성되었지만 MySQL을 사용해보록 하겠습니다.


MySQL 설치

다음의 명령어로 MySQL 설치한다.

brew install mysql

다음의 명령어로 MySQL 기본 설정을 시작한다.

mysql_secure_installation
  • Would you like to setup VALIDATE PASSWORD component?(비밀번호 복잡도 검사 과정)
  • Please set the password for root here.
    New password:
    Re-enter new password:
    (비밀번호 입력 & 확인)
  • Remove anonymous users? (익명 사용자 삭제)
  • Disallow root login remotely? (원격 접속 허용 여부)
  • Remove test database and access to it? (test database 삭제 여부)
  • Reload privilege tables now? (previlage 테이블 로드 여부)
  • MySQL 서버 시작
mysql.server start

  • MySQL 사용
mysql -u root -p
  • -u : MySQL에 접속할 사용자의 아이디를 명시하는 옵션 (여기서는 root사용자로 접속)

  • -p : 비밀번호를 직접 입력하겠다고 명시하는 옵션

  • MySQL 데이터베이스 생성

create database [db_name] character set utf8mb4 collate utf8mb4_general_ci;
  • 생성된 데이터베이스 확인
show databases;

  • 데이터베이스 사용
use [db_name]
  • 데이터 베이스 안 테이블 확인
show tables;


⬆️ 데이터베이스 안에 테이블을 설정해주지 않아 비어있는 모습 ⬆️

mysite/settings.py에 다음내용을 작성한다.

하지만 위와 같은 정보(데이터베이스 패스워드 등)는 중요한 정보이므로 github등으로 코드를 관리시에는 반드시 중요 정보를 가려주어야 한다.

보안을 위한 설정

manage.py와 같은 위치에 my_settings.py 파일 만들기

touch my_settings.py

my_settings.py에 다음 내용 작성

settings.py 수정하기


데이터베이스 migration 전 mysqlclient를 설치한다

pip3 install mysqlclient

데이터베이스에 테이블을 생성하기 위해 다음 명령을 실행한다.

python3 manage.py migrate

MySQL 에서 migrate된 테이블들을 확인 가능하다.

migrate명령은 INSTALLED_APPS설정을 살펴보고 mysite/settings.py파일의 데이터베이스 설정과 앱과 함께 제공되는 데이터베이스 마이그레이션에 따라 필요한 데이터베이스 테이블을 생성한다.

모델 만들기

모델이란 부가적인 메타데이터를 가진 데이터 베이스의 구조를 말한다.

django 튜토리얼 설문조사 앱 만들기에서는 두가지 모델을 만든다.

  • Question
  • Choice

A Question은 질문과, 발행일을 가지고 있고, A Choice는 선택지총 투표양을 가지고 있다.
A Question과 A Choice는 서로 연결되어있다.

polls/models.py를 열어 다음과 같이 작성한다.

각 모델은 django.db.models의 하위 클래스로 표현된다.
각 모델에는 여러개의 클래스 변수가 있으며 각 변수는 모델의 데이터베이스 필드를 나타낸다.

다음은 각 필드가 어떤 자료형을 가질 수 있는지 django에게 전해준다.

  • CharField : 문자 field
  • DateTimeField : 날짜와 시간(datetime) field

정리하자면 question_textfield는 최대 200자의 문자형 자료형을 가질 수 있고(CharField의 경우 max_length를 입력해 주어야한다), pub_datefield는 날짜와 시간 자료형을 저장할 수 있다는것을 뜻한다.

필드들은 defalut처럼 다양한 선택적 인수들을 가질 수도 있다.

모델의 활성화

앞서 작성한 모델에 대한 코드로 django는 다음과 같은 일을 할 수 있다.

  • 이 앱을 위한 데이터베이스 스키마 생성(CREATE TABLE 문)
  • QuestionChoice 객체에 접근하기 위한 Python 데이터베이스 접근 API를 생성

django가 위와 같은 일을 할 수 있도록 하려면 앱의 구성 클래스에 대한 참조를 INSTALLED_APPS설정에 추가해야 한다.
PollsConfig클래스는 polls/apps.py 파일 내에 존재한다.

이 경로를 mysite/settings.py파일의 INSTALLED_APPS에 다음과 같이 추가한다.

makemigration명령으로 새로운 모델을 만들었고 이 변경사항을 migration으로 저장시키고 싶다는 것을 django에 알려줄 수 있다.

python3 manage.py makemigrations polls

migration ?

migration은 django가 모델및 데이터베이스 스키마에 대한 변경사항을 저장하는 방식이다.
migrate : migration을 실행시켜주고, 자동으로 데이터 베이스 스키마를 관리해주는 명령어
sqlmigrate : mygration이름을 인수로 받아 실행하는 SQL문장을 보여준다

  • 테이블의 이름은 앱의 이름과 모델의 이름이 자동으로 조합되어 생성된다 (polls_question, polls_choice) 재 지정하여 수정 가능
  • 기본 키(ID)가 자동으로 추가된다. 재 지정하여 수정 가능
  • foreign key relationship은 FOREIGN KEY제약 조건에 의해 명시된다.
  • 사용하는 데이터베이스에 따라 데이터 베이스 고유의 필드 타입이 조정된다.
  • sqlmigration 명령은 데이터베이스에서 마이그레이션을 실제로 실행하지는 않지만, SQL django가 필요하다고 생각하는 바를 확인할 수 있도록 마이그레이션 명령을 화면에 인쇄한다. django가 수행할 작업이나 변경에 SQL 스크립트가 필요한 데이터베이스 관리자가 있는지 확인하는 데 유용하다.

다음의 명령어를 실행시켜 데이터베이스에 모델과 관련된 테이블을 생성할 수 있고, 데이터베이스에서 생성된 테이블을 확인 가능하다.

python3 manage.py migrate


API 가지고 놀기

python 쉘을 사용하여 django API를 사용 할 수 있다.
python 쉘은 다음 명령어로 실행시킨다.

python3 manage.py shell

  • question 데이터 모두 불러오기
# Import the model classes we just wrote
>>> from polls.models import Choice, Question
>>> Question.objects.all()


데이터베이스가 비어있으므로 아무것도 출력되지 않는다.

  • Create a new Question
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())

# Save the object into the database.
>>> q.save()


shell에서 작성한 명령어가 MySQL 데이터베이스에 저장된 것을 볼 수 있다.

  • Change values by changing the attributes
>>> q.question_text = "what's up"
# Save the object into the database.
>>> q.save()


shell에서 저장된 question_text를 수정하는 것도 가능하다.

  • 저장된 question 객체 확인하기

다음의 명령어를 통해 Question에 저장된 객체의 갯수를 확인할 수 있다.

>>> Question.objects.all()

하지만 <Question: Question object (1)> 은 객체를 표현하는데 직관적이지 않다.

  • 객체 표현식 수정하기

모델에 __str__() 메소드를 추가하는 것은 객체의 표현을 대화식 프롬포트에서 편하게 보려는 이유뿐 아니라 Django가 자동으로 생성하는 관리 사이트에서도 객체의 표현이 사용되기 때문이다.

  • 모델에 custom method 추가하기

import datetime : python표준 모듈인 datetime모듈
from django.utils import timezone : django의 시간대 관련 유틸리티

변경된 사항을 저장 후 다음을 실행한다.

python manage.py shell
>>> from polls.models import Choice, Question
>>> Question.objects.filter(id=1)

앞 전의 결과와는 다르게 데이터베이스에 저장된 객체의 내용을 확인 할 수 있다.


존재하지 않는 id를 사용하여 객체를 가져올 경우 polls.models.Question.DoesNotExist를 반환한다.

커스텀 한 메소드 was_published_recently()도 동작한다.

다음의 명령어는 pk=1questionchoice객체를 모두 가져온다.

아직 저장된 choice가 없으므로 빈 리스트를 반환한다.

다음의 명령어로 choice를 생성할 수 있다.

데이터베이스에 저장된 choice들을 확인할 수 있다. 각 choice들은 pk=1question_idforeign-key로 가지고 있다.

filterdelete로 원하는 choice를 삭제할수도 있다.

데이터베이스 내에서도 삭제된 모습을 확인할 수 있다.


Django 관리자 소개

django는 모델에 대한 관리용 인터페이스를 모두 자동으로 생성해 준다.
관리자 사이트는 사이트 방문자를 위한 것이 아니라, 사이트 관리자를 위한 것이다.

관리자 생성하기

다음과 같은 명령을 수행해 관리 사이트에 로그인 할 수 있는 사용자를 생성할 수 있다.

python manage.py createuperuser

비밀번호를 임시로 12345를 사용했더니 경고창이 나왔다.

비밀번호의 유효성 검사 로직은 다음과 같을 것으로 예상한다.

  • 8자 이상일것
  • 흔히 쓰는 비밀번호가 아닐것
  • 숫자로만 만들지 않을것

튜토리얼을 학습하는 용으로 생성한 관리자이기때문에 Bypass password validation and create user anyway?(유효성 검사를 건너뛰고 유저를 생성하겠습니까?)y로 답했다.

서버가 꺼져있다면 runserver로 서버 실행 후
http://127.0.0.1:8000/admin/로 이동하면 django administration 로그인 창이 나온다.

앞서 생성한 슈퍼유저(superuser)계정으로 로그인 하면 다음과 같은 django 관리 인덱스 화면이 나온다.

관리 사이트에서 poll app을 변경 가능하도록 만들기

관리 사이트에서 poll app을 변경가능하도록 만드려면 polls/admin.py파일을 다음과 같이 작성한다.

이제 관리 사이트에서 polls를 확인할 수 있다.

Question을 클릭하면 질문들을 위한 change list로 이동한다. 데이터베이스에 저장된 질문들을 보여주며 그 중 하나를 선택하여 변경할 수 있다. 전에 데이터베이스에 저장한 What's up을 볼 수 있다.

What's up을 클릭하면 text, Date published항목을 수정할 수 있다. Now를 클릭하면 현재시간으로 설정할 수 있다. SAVE버튼을 눌러 변경사항을 저장한다.



수정된 내용도 데이터베이스에 반영된다.


HISTORY 버튼을 눌러 누가 언제 무엇을 바꾸었는지 확인할 수 있다.

profile
Convinced myself, I seek not to convince.

0개의 댓글