Django 프로젝트 세팅 3(앱 생성, 구성, 저장)

강민성·2021년 12월 9일
0

앱 생성, 구성, 저장

앱 생성

django-admin startapp 앱이름 
python manage.py startapp 앱이름 # 현재 위치에 앱 생성
혹은
python manage.py startapp 앱이름 . # 현재 위치/앱 디렉토리/ 에 앱 생성

프로젝트 디렉토리(manage.py가 있는 위치)에 앱 생성

settings.py에 앱 디렉토리/apps의 클래스 추가

'앱디렉토리명.apps.AppnameConfig'

settings.py의 INSTALLED_APPS 리스트 안에 앱 디렉토리/apps.py의 클래스 추가

앱 디렉토리 안에 urls.py 생성, app_name 저장

app_name = "앱이름"

앱 디렉토리/urls.py 안에 위 코드 추가

프로젝트 디렉토리/urls.py에 앱 디렉토리/urls.py의 앱 경로 추가

from django.urls import include
path('앱이름', include('앱이름.urls'))

프로젝트 디렉토리/urls.py 안의 urlpatterns 리스트에 앱 디렉토리/urls.py의 앱 경로 추가

앱 구성

앱 디렉토리/models.py 구성

앱 디렉토리/models.py에 model의 dbfield를 나타내는 클래스들을 추가
클래스명(models.Model) models.py에서 모델의 기능을 사용할 수 있게끔 하는 클래스의 기본 형식
클래스명은 단수, 테이블명은 복수로 명명
attribute명 = models.필드명(~, unique=True) attribute에 고유한 값만 들어올 수 있음(중복 방지, 이미 해당 attribute에 같은 값이 존재하면 생성되지 않게 함)
암호화된 값이 들어올 필드(ex. 비밀번호)의 경우에는 최대 길이를 256자 정도로 설정
앱명.클래스명 다른 앱의 모델을 참조하고 싶을 경우 import
파이썬의 package import convention

변경사항 저장

python manage.py makemigrations 앱이름 지금까지의 변경사항에 대한 migration 만들기
python manage.py migrate 변경사항을 데이터베이스에 적용

앱 디렉토리/views.py 구성

앱 디렉토리/views.py에 앱의 뷰들 추가
models.py의 클래스들을 기반으로 view 작성
클래스명(View): 뷰 이름(클래스명)은 어떤 데이터를 사용할지를 나타내는 이름으로 짓기
클래스 내의 함수: 함수명(self, request): request를 받아서 self에 대해 함수를 실행할 것이므로 인자를 이렇게 설정
정규표현식을 사용할 경우, 자주 사용되는 경우가 아니라면 compile()해서 사용하지 않고, match()를 사용하는 것을 공식 문서에서 추천하고 있음
정규표현식을 명명할 때는 대문자로 명명(ex. REGEX_EMAIL)
try-except 구문으로 에러를 처리할 때는, except 뒤에 에러명을 구체적으로 명시해서 예외처리를 해야 디버깅하기 쉬움
from 앱명.models import 클래스명 다른 앱의 모델을 참조하고 싶을 경우 import

import

import json json 라이브러리를 통해 json 데이터를 딕셔너리로 바꿔서 사용
from django.http import JsonResponse 우리가 만든 데이터를 딕셔너리로 만들어서 보낼 수 있게 하는 클래스인 JsonResponse 클래스 import
from django.views import View 장고에서 제공하는 View 기능을 사용하기 위해 import
from 앱명.models import 클래스명 모델의 클래스들을 사용하기 위해 import
from django.conf import settings 데이터 암호화(bcrypt, JWT)를 위해 환경변수(프로젝트의 SECRET_KEY와, ALGORITHM)를 import(환경변수의 실제 내용은 기밀이므로 my_settings.py에만 있고 settings.py에서 환경변수들을 import하는 형태여야 함. views.py 본문에서 환경변수들을 사용할 때는 settings.ALGORITHM, settings.SECRET_KEY 로 사용하면 됨)

def post(self, request)

POST 요청(create)을 받을 함수
request 안에는 프론트(클라이언트)가 보내는 데이터가 다 들어 있음
data = json.loads(request.body) 프론트엔드에서 받은 요청(request)의 json 데이터(request.body)를 받아와서 딕셔너리로 변환(json.loads)하여 data라는 변수에 담기. 모든 데이터가 json으로 오는 것은 아니므로, json이 아닌 다른 형식으로 오는 데이터는 별도로 변환해주는 과정을 거쳐야 함
모델명(모델의클래스명).objects.create(모델의attribute = data['attribute의key값'], ...) 데이터를 딕셔너리에서 key값으로 불러와서 모델(모델의 클래스)의 객체 생성. 어떤 데이터를 어떤 key 값으로 정할 것인지는 프론트와 백이 상의해서 정해야 함. 데이터는 아래와 같은 형태가 됨

return JsonResponse(프론트에서POST메서드를보내왔을때내가보낼데이터, status=응답코드)
내가 보낼 데이터는 딕셔너리 형태여야 함
내가 보낼 데이터에는 생성되었다는 메시지({message: created})만 보내거나, 생성된 내용을 보낼 수도 있음

def get(self, request)

GET 요청(read)을 받을 함수
불러올(return할) 정보를 알맞은 형태(ex.리스트)로 가공하는 함수 내용을 작성
변수명 = 모델명(모델의클래스명).objects.all() 데이터베이스에서 가져온 모델(모델의 클래스)의 모든 데이터(정보)를 변수에 담기
리스트명 = [] 빈 리스트 생성
위에서 변수에 할당한 쿼리셋에 for문을 돌려서 쿼리셋에 들어있는 객체 하나하나의 정보를 뺴서 정보들이 담겨있는 딕셔너리 형태로 만든 후, 만들어둔 빈 리스트에 딕셔너리들을 하나씩 담기

  • 여러 개의 데이터를 보낼 때는 리스트 안에 딕셔너리를(+그 딕셔너리 안에 다른 딕셔너리를..) 담아서 리턴
  • 프론트에서 id가 필요한 경우가 많기 때문에, 웬만하면 데이터를 보낼 때 id도 같이 보내는 게 좋음
  • 역참조 활용
    역참조하고싶은클래스명을소문자로바꾼것_set 장고의 매니저 클래스. 역참조를 할 때 쓰임. 여러 개가 될 수 있기 떄문에 뒤에 .all()등을 붙여서 어떤 정보를 쓸지 결정
    참고자료: 정참조와 역참조

프로젝트 디렉토리/urls.py에 맵핑

from django.urls import include
path('앱명', include('앱디렉토리명.urls')
urlpatterns 리스트 안에 path 추가
프로젝트에 속한 앱들의 앱별 url들을 각 앱의 urls.py로 라우팅
(~앱명이라는 엔드포인트가 오면 앱디렉토리명.urls로 보내겠다는 뜻)

앱 디렉토리/urls.py 생성(없으면), 구성(맵핑)

from django.urls import path

뷰 연결

from 앱명.views import 뷰클래스명
path('/엔드포인트', 뷰클래스명.as_view()) urlpatterns 리스트에, path()를 통해 뷰들의 연결 추가
어떤 url로 왔을 때 이 뷰로 연결할지 설정(엔드포인트가 '/앱명/엔드포인트'일때 해당하는 뷰로 연결)
하나의 엔드포인트에서 여러 가지 메소드가 실행되게 할 수도 있음
앱의 url에서 어떤 디테일 페이지로 갈지는 path parameter(path variable)로 구분

httpie로 Request 보내기

서버 켜기

python manage.py runserver 포트이름
request를 보내기 위해 서버 동작시키기
http 요청을 보내기 전에는 서버를 켜야 함(안켜면 Connectionerror 발생)
로컬로 작업한 장고 서버를 외부에서 접속할 수 있게 하기 위해서는 포트이름에 0:8000 입력
cf) http 주소의 구조

  • 프로토콜: 보통 https://
  • 호스트: 호스트의 ip
    (내 로컬 서버 ip 확인하는 터미널 명령어 ipconfig getifaddr en0)
  • 리소스: 서버에서 지정한 엔드포인트(ex. /users/login)

Request 보내기(by httpie)

httpie를 먼저 설치해야 함
httpie는 기본으로 데이터를 문자열로 전송
httpie 사용법

POST(create)

$ http -v 메소드명(POST/GET/..) 127.0.0.1:8000/엔드포인트 키1='값1' 키2='값2' 키3='값3'
httpie로 json 형태의 데이터를 보내는 코드
--> 제대로 작동할 경우: 위에서 정한 응답값과 status 출력
--> 에러가 날 경우: 에러코드(ex.500) 출력(필요한 경우 이 에러코드를 프론트에 전달해야 함)

GET(read)

$ http -v GET 127.0.0.1:8000/엔드포인트
데이터베이스에 있는 데이터를 불러올때 GET 메서드 사용
GET메서드는 바디가 없음
--> 제대로 작동할 경우: 위에서 정한 응답값과 status 출력
--> 에러가 날 경우: 에러코드(ex.500) 출력(필요한 경우 이 에러코드를 프론트에 전달해야 함)

profile
Back-end Junior Developer

0개의 댓글