Application/Python-Django

Django 에어비앤비 클론 1부 (21.02.01 ~ 25)

winney916 2021. 3. 22. 19:51
728x90

Chapter 0 : Requirment [02/01]

음 파이썬 기반 풀스택 작업을 하는데에는 몇가지 선택지가 있는데,

백앤드 : Django VS flask or pyramid

플라스크나 피라미드는 micro framework, 작은 서비스에 적합하다. 규모가 커질수록 노동력이 훨씬 많이 필요하다고..

프론트 : Django template VS React

장고 템플릿도 꽤나 좋은 시스템이라서 정말 엄청 많은 인터랙션이 필요한게 아니라면 리액트를 사용할 필요가 없다고 한다.

Chapter 1 : Environment Setup [02/02]

- pip VS npm

pip : package installer for python / 얘는 빠꾸가 없다. 다운로드를 받으면 global하게 받아버려서 여기저기 막 적용된다. (그래서 VSC html 을 작성할 때 자꾸 django template으로 나왔던건가?..) 프로젝트를 개발할 때 장고 버전이 꼬이면 프로젝트가 망가질 수 있다.

그래서 이걸 local하게 받아주는, npm같은 친구를 사용하는게 좋다고... 그게바로 pipenv

pip install --user pipenv

그리고 프로젝트를 시작하려면, 먼저 디렉토리를 생성하고 그 안에서

pipenv --three

python3를 사용하는 환경을 만든다.

이후

pipenv shell

이걸 쳐야만 그 가상환경(니꼬쌤은 버블이라고 했음!!) 에 들어갈 수 있다고 한다. 이후에는 pip대신에 pipenv를 사용해주면 된다.

때문에!! 가상환경[ 버! 블! ] 셋업을 사용하려면 새로운 터미널에서 실행시켜야한다!!

pipenv install Django==2.2.5

니꼬쌤이 2.2.5 버전을 사용하신다고 한다.

오... 이제야 좀 깃허브에 익숙해진거같은데...

git init : 깃허브 설정

git remote add origin url : 깃허브 리모트 레파지토리를 설정하는건데, 기본적으로 git remote페이지에 어떤 파일도 생성해서는 안된다. 그래야 안막히고 잘 됨. (뭐랄까, 깃 페이지에서 초기설정을 해버리면 안되는? 초기설정을 내 에디터에서 직접 할거니까?)

그 후에

touch README.md

touch .gitignore 등을 만들어주면 된다.

gitignore은 깃에 올리지 않았으면 하는 파일의 목록을 저장하는 곳인데, 파이썬은 온갖 이상한 파일들을 생성한다. (다른 언어들도 그럴려나?) 그래서 구글에 gitignore python을 치면 잘 나오니까 복붙해주면 깔끔.

Chapter 2 : Introduction to Django [02/03]

장고 튜토리얼에서 제공하는 프로젝트 생성 가이드라인이 있는데, 니꼬쌤은 그게 초보자를 위한 가이드라고 그랬다.. 그래서 다른건 알려주셨는데

django-admin startproject config

이걸 하고나면 config - config, manage.py 폴더가 생긴다. config폴더의 이름을 다른 이름으로 바꿔준 뒤 안에 있는 파일들을 모두 꺼내주고 이름을 바꾼 폴더를 삭제한다.

그 다음 VSC에 설정되어있는 python-version을 워킹 디렉토리의 pipenv 버전으로 바꿔준다.

<Linter> : python 코드에서 에러를 미리 감지해주는 친구이다. (파이썬은 컴파일 기능이 없기 때문에 에러 점검 없이 실행을 할 경우 프로그램이 폭발할 수 있다.) pylint, flake8 등 여러 패키지가 있다.

<formatter> : format the code to look better. black을 사용하는 니꼬쌤

이거 두개 셋업하는거 너무 꼬이는데 어떻게 해야하지..???

일단 무시하고 진행 ㄱㄱ

린터는 되고있는 것 같았고... 블랙이 안돼서 문제였는데

Select VS Code -> View -> Command Palette, and type: Format Document With

스택오버플로어에서 찾은거 보고 들어갔더니 python하나 있었고.. 그걸 선택하니까 갑자기 black이 적용되기 시작함

이거뭐지?.. 초심자의 행운 같은건가.. 여튼 감사링..

python manage.py runserver

서버 실행 명령어! 잊지 않았겠지??

python manage.py createsuperuser

admin 페이지에 입장할 때 사용할 슈퍼유저 계정을 만든다.

python manage.py makemigrations

python manage.py migrate

migration이란, 장고 model 파일에서의 변화를 DB 스키마에 전달하는 행위인데, 쉽게말하면 내가 변경한 파일들 ( DB의 형태와 관련된)을 DB와 동기화시켜주는 작업이라고 보면 된다.

프로젝트 = 어플리케이션들의 집합, 어플리케이션 = function들의 집합.

장고 프로젝트는 작은 어플리케이션들로 분리되고, 이 분리된 어플리케이션들이 서로 정복(conquer)하면서 구성되는 시스템(?)이라고 보면 된다. 그래서 최대한 명료하고 간단한 형태의 어플리케이션들을 정의해야한다. (니꼬쌤은 기능을 한문장으로 정의할 수 있어야 한다고 했다. AND라는 표현 없이!)

그래서 하나의 어플리케이션을 만드는 명령어는

django-admin startapp {appnames}

이렇게 되고, 앱의 이름은 항상 복수형(plural)으로 적어야한다고..?

+) framework VS Library

소프트웨어의 제작을 도와주는 소프트웨어라는 점에서는 동일하나, 규칙 준수 여부에 따라 달라질 수 있다. 라이브러리 같은 경우에는 변수명이나 파일 이름 등을 빌드하는 과정에서 자유롭게 사용할 수 있다. 때문에 react-native는 라이브러리라고 표현할 수 있다.

반면에 프레임워크는 엄격하게 준수해야하는 룰이 있다. 파일 이름, 변수 명 등, 절대 변경해선 안되는 영역이 있는데, 이런 경우에는 프레임워크라는 표현이 적절하다.

Chapter 3 : Build User APP [02/04]

- Replacing Default User : django admin에 있는 기본 기능인 유저 관리 창을 커스텀 하는 방식이다. 이런저런게 있지만.. 핵심은 장고 다큐먼트에서 제공하는

AUTH_USER_MODEL = 'myapp.MyUser'

인듯 하다. .... 공부가 한참 더 필요할듯..

- migration

어우 피곤하니까 얼른 적고 자자. django의 장점 중 하나는 sql을 사용하지 않고 DB를 이용할 수 있다는 점인데, 이를 위한 도구가 migration이라고 보면 된다. makemigrations를 하면, 내가 작성한 models.py 와 admin.py를 기반으로 data table을 만든다. 그 후 migrate를 진행하면, model의 정보를 기반으로 만든 데이터테이블을 데이터베이스와 동기화한다. (syncronize DataTable and DataBase) 드디어 이해했다!

- model fields

음,, 뭐 다 장고 다큐먼트에 나와있는 내용이라서 쓸 말이 별로 없기는 하다. 좀 신기했던건, class를 선언한 위에 """ """를 이용해서 주석을 달아주면, 다른 파일에서 import한 뒤 사용할 때, 주석처리된 내용이 설명처럼 하단에 나오게 된다. (커서 마운트로 정보를 조회할 때)

외에도 charset에 list도 넣었고.. 음... 뭘 많이 했다. 모든 값을 기본적으로 필수입력형태로 만드는데, blank 옵션을 참으로 만들어주면, 필수가 아닌 요소로 바꿔줄 수 있다.

models.DateField() 를 사용하면 날짜 입력창이 나오는데, 옆의 캘린더 아이콘을 누르면 날짜를 고를 수 있는 캘린더가 나와야 하는데 왜 안나올까..?

계속해서 Django admin 패널을 커스텀 하는 일을 하고있다. 한 앱 내에서 models를 만들고, 이걸 admin으로 import 해서.. damin에서 register 하고........ 어...... 이야... 어렵네..

Chapter 4 : ROOM APP [02/15]

- abstract

app에서 models.py를 작성할 때, 반복되는 코드를 특정한 app으로 분리해서 관리하고 싶을 수 있다. 이때 따로 분리된 app은 DB에 반영되어선 안되는데, 그런 상황을 위해서 클래스 내에 metaClass를 작성함으로써 해결할 수 있다.

class Meta: abstract = True

이렇게 하면 DB에 반영되지 않는 클래스를 만들 수 있다.

- connect models through fields : ForeignKey -> many to one

model에 field를 선언할 때, models.ForeignKey(other_model, on_delete=CASCADE)를 사용해주면, 다른 모델에 있는 data를 가져올 수 있다. on_delete옵션은 모델 삭제를 진행할 때, 어느 수준 혹은 형태로 삭제를 진행할 지에 대해서 설정할 수 있다. 특히나 models.CASCADE 옵션 같은 경우에는 cascade(폭포수)형태로, 하나의 모델 객체를 지우면 상속된 모든 모델의 객체가 삭제된다.

ForeignKey 의 특징은 many to one (일대다) 관계를 가진다는 것이다. 마치 하나의 유저가 여러개의 포스트를 올리는 인스타그램처럼, ForeignKey에 들어온 other_model은 일대다 관계에 있는 (하나에 해당하는) 모델이다.

field를 선언한 class가 target클래스에서 여러개로 조회된다.

+) __str__ method

해당 모델에 속해있는 data들을, 다른 모델에서 콜했을 때 어떤 형태로 보여줄 것인지 설정한다. return값으로 설정할 수 있다.

- connect models through fields : ManyToManyField -> many to many

model에 field를 선언할 떄, models.ManuToManyField(other_model, options)를 사용해주면 다른 모델에 있는 클래스 데이터를 가져올 수 있다.

many to many, 다대다 관계를 가지기 때문에 type등에 사용할 수 있다.

+) model내 class들을 연결할 때, 보통은 변수 명을 그대로 사용하는데, 클래스가 밑에 작성되어있는 경우에는 작동하지 않는다. 또 import하지 않았을 때에는 다른 모델이 있는 클래스를 사용할 수 없다. 이럴 때 string타입으로 입력하면 django가 알아서 해결해준다. 모델 내부에서는 "ClassName", 모델 외부의 다른 모델에서 가져올 때에는 "model_name.Class_name". 장고는 엄청나다.

- subClass Meta in Class in Model. to admin.

model을 정의한 뒤, admin.py에서 등록을 해주면, django admin 패널에 나올 때, s라는 복수형 표현이 붙어서 나온다. 근데 복수형으로 변환할 때 막무가내로 s를 붙이면 안되는 상황이 있는데, 이런 저런 여튼 model내의 class객체에 대한 추가적인 설정이 필요할 때에는 항상 Meta 하위 클래스를 사용해주면 된다. 대표적인 옵션으로는 verbose_name, verbose_name_plural, ordering 등이 있다. 순서대로 admin에 표시될 이름, 표시될 복수형 이름, 정렬순서이다.

Chapter 5 : ALL OTHER APPS [02/18]

- django의 ForeignKey 능력은 좀 대단해서, 연결만 해 놓으면 객체에 접근할 수 있다.

비슷한 맥락으로 남은 app들을 만들었다.

먼저 django_settings.py에서 app등록을 한 뒤, app내부에서 model을 정의하고, admin에 등록해주면 된다.

Chapter 6 : ROOM ADMIN [02/22]

- search_fields

admin 패널에서 검색할 수 있는 기능을 추가하는 것이다. list나 tuple형태로 만들 수 있는데, ^, = 등의 기호를 추가함으로써 검색기능을 커스텀 할 수 있다. 기본값은 icontain. 가장 둔감한(insensitive) 형태의 검색방식이다. 그냥 포함되는 스트링이 있으면 다 나오게 된다.

- fieldsets

admin 패널 중 특정 데이터를 수정하는 영역에 들어갈 때, 그 영역의 레이아웃을 설정해주는 방법이다. 튜플과 딕셔너리를 조합하면서 짜주면 admin/something/change의 레이아웃을 조절할 수 있다.

뭔가 길어서 접어주고 싶다면, "classes" : ("collapse",), 를 추가해주면 된다.

- add Function to list_display

뭔가 데이터의 개수를 카운트 해서 리스트에 보여주고 싶을 수 있다. 그럴 때에는 별도의 함수를 클래스 내에 선언해서 리스트 디스플레이 내에 스트링으로 입력해주면 된다.

admin 창에서 데이터 유형을 클릭하면 ordering이 되는데, 기본값 설정을 해줄 수도 있다

ordering = (tuple)

이런 행위를 가능하게 해주는 장고의 기능이 object이다. 함수를 선언할 때 (self, obj)를 해줘야 한다. obj라는 친구가 모든 field들을 연결할 수 있게 해준다.

Chapter 7 : MODELS AND QUERYSETS [02/23]

- QuerySets & Manager

Manager : Django가 데이터베이스로부터 elements를 가져온다. (SQL을 대신하다.)

QuerySets : Django내에서의 field 들의 연결을 이용하며 객체를 사용할 수 있는 기능이다. Manager와 연결되어 있는 형태로, 데이터를 불러올 수 있다. QuerySets API

연습하고 싶을 때는 터미널에서 pipenv 에 들어간 후, 

python manage.py shell

하면 django로 설정해놓은 환경에서 작업할 수 있다.

from app_name.models import model_class_name
all_objects = model_class_name.objects.all()

이런 느낌으로 사용하면 된다.

 

+) python functions

- vars() : dictionary or class 안에 있는 것들을 리턴한다

- dir() : class 안에 있는 것들을 리턴한다

- Djanog ORM(Object Relationship Mapping)

models.py 에서 fields를 정의할 떄, related_name 이라는 옵션을 넣어주면 ORM에서 호출할 이름을 설정할 수 있다.

연습이 생명!

Chapter 8 : MORE ADMIN [02/25]

- 연습함.

특정 메서드가 admin에서 표현되는 이름을 설정해주고 싶을 때, methods.short_description = "string", 해주면 된다.

method의 return type이 boolean 일 때, method.boolead = True 로 해주면, return 값이 나올 때, django에서 제공하는 o, x 표시로 나온다.

timezone을 사용하고 싶다면, django.utils 에 있는 timezone을 사용하길 바란다. 서버 내부 시간과 동일하게 작동하기도 하고, 해당 지역에 맞춰서 변경해주는듯.

- configuring user uploads : 업로드되는 파일을 어떻게 관리할 지에 대해서

config/setting.py 에서 MEDIA_ROOT 를 설정해준다.

MEDIA_ROOT = os.path.join(BASE_DIR, "uploads")

os.path 라이브러리를 활용하면 좋다. 이렇게 하면 업로드되는 파일들은 모두 저 directory로 가게 되는데, 업로드 하는 field의 옵션으로 upload_to = " directory_name"을 넣어주면 하위 디렉토리까지 생성해 저장할 수 있다.

안녕..? 몇일만에 보지?.... ㅋㅋㅎㅎㅋㅎㅋㅎㅎㅎ 게으른 나... 반성해 ^^.. - 03/15

Media 루트를 설정할 때, 저렇게 설정을 끝내버리면 모든 미디어가 상대경로로 작동한다. 이걸 절대경로로 바꿔주려면 settings.py 에 MEDIA_URL = "/media/" <- 앞에 " / " 를 넣어주면 된다.

settings에는 DEBUG라는 인스턴스가 있는데, 이 값을 참으로 설정해 놓으면 url에러가 발생했을 때, web브라우저의 오류창으로 가지않고, django 디버깅 모드로 들어가게 된다. 이걸 잘 이용할 수 있다.

- html 코드 삽입하기

장고는 보안에 신경을 많이 쓰기 때문에, 단순하게 html코드를 넣으면 실행되지 않는다. 그럴 때,

from django.utils.html import mark_safe 함수를 사용하면 된다.

- raw_id_fields = ()

장고 어드민은 기본적으로 무언가를 선택할 때, select_box를 top-down 방식으로 제공한다. 근데 만약 필드에 해당하는 데이터의 수가 너무 많다면, 이 방식은 가시성이 훨씬 떨어질 수 있다. 이 때 사용할 수 있는 선택지 중에 하나이다. 훨씬 편하게 데이터를 선택할 수 있다.

- InlineModelAdmin

장고에서 각 class field를 이어줄 때, foreignkey나 manytomany를 사용했다. 이걸 사용하지 않고 필드들을 이어주는 방법이 있는데 이게 inlinemodels이다. 클래스 admin.TabularInline을 상속시키고, 다른 클래스에 inlines 컴포넌트를 생성 후, 튜플이나 리스트 형태로 위에 inline이 상속된 클래스를 스트링타입으로 작성해주면 된다. inline에는

Tabular : 표의, 단단한 판자 모양의 -> 행 방향으로 속성들을 나열 (prefered)

Stacked : 쌓인 -> 열 방향으로 속성들을 나열하는 두가지 방식이 있다.

- Save method override

model 및 model admin에서 save 메소드를 추가적 수정을 거쳐 사용하는 방법을 익혔다. 근데 좀 이해가 잘 안됐지만.. 뭐 자주 사용한다니까 일단 넘어가보자

일단 여기까지 1부를 마친다.. (26% 수강함... 나란닝겐..) 내일부터 작성되는 애들은 2부로 작성하려고 한다. 왜냐면 이 포스트가 너무 길어졌거든... 일단 경영 빅데이터 시험보는 날 (4/10)까지는 다 끝내야 그 다음 주 부터 한달간의 challenge에 들어갈 수 있다. 제발 해내자!! 제발!!