장고 동작 원리 등 장고 기초 지식은 따로 포스팅하고, 오늘은 장고 실습 중 겪었던 우여곡절을 우선 기록한다.
실습 프로젝트 진행 순서
- 미니콘다 가상환경 생성
conda create -n 가상환경이름 python=버전
- 장고 설치
pip install django
- 프로젝트 생성
django-admin startproject 프로젝트명
- 앱 생성
python manage.py startapp 앱이름
- 메인 디렉토리 내 setting.py에서
INSTALLED_APPS
항목에 앱 추가앱이름
- 앱 디렉토리 내 views.py에서 request가 들어왔을 때 화면에 띄워줄 내용 세팅
# 엔드포인트 뷰를 꾸릴 때 항상 사용하는 대표적인 요소
import json
from django.views import View
from django.http import JsonResponse
# get 요청이 들어왔을 때 출력할 것
class 뷰클래스이름(View):
def get(self, request):
return JsonResponse({"메시지":"메시지"}, status=200)
- 앱 디렉토리에 urls.py를 생성해서 클라이언트가
주소/앱이름
을 요청했을 때 views.py에서 세팅한 내용이 보이도록 설정
from django.urls import path
from .views import MainView
# 메인도메인/앱이름 경로로 들어왔을 때 MainView 클래스 안 return값 보여줌
# path('', MainView.as_view())에서 ''부분에 uri 값 추가 가능
urlpatterns = [
path('', MainView.as_view())
]
- 메인 디렉토리 urls.py에 앱 디렉토리 내 urls.py를 연결
# 장고에서 기본으로 지원하는 어드민 사이트 관련
from django.contrib import admin
# include 추가로 임포트
from django.urls import path, include
urlpatterns = [
# 장고에서 기본으로 지원하는 어드민 사이트 관련
path('admin/', admin.site.urls),
# 메인도메인/앱이름/ 부분에서 '앱이름/' 입력 및 앱 디렉토리 내 urls.py 파일 경로 지정
path('앱이름/', include('앱이름.urls'))
]
- models.py에서 클라이언트가 입력한 정보를 담을 테이블 생성
from django.db import models
# 여기서 만든 클래스는 장고-db에서 임포트 한 models 패키지의 Model 클래스를 상속 받음
class 클래스이름(models.Model):
# 속성 타입(정수, 문자열 등)에 따라 데이터 길이나 조건 명시
속성1 = models.CharField(max_length=최대길이값) # 문자열
속성2 = models.IntegerField(default=0) # 정수
속성3 = models.DataTimeField(auto_now_add = True) # 시간 (최초 발행시간. 변경 X)
속성4 = models.DataTimeField(auto_now = True) # 시간 (업데이트 시간)
...
- DB 테이블에 반영하기
python manage.py makemigrations
후python manage.py migrate
- views.py가 models.py에서 정보를 가져오거나(
GET
) 입력할 수 있도록(POST
) 연결
import json
from django.views import View
from django.http import JsonResponse
# 추가
from .models import 클래스명
# post, get 메서드 정의
class 뷰클래스이름(View):
def post(self, request):
data = json.loads(request.body)
Users(
속성1 = data['필드1'],
속성2 = data['필드2'],
).save() # 데이터 테이블에 저장
return JsonResponse({'message':'SUCCESS'}, status=200)
def get(self, request):
return JsonResponse({"Hello":"World"}, status=200)
- httpie로 데이터 입력해서 테스트 해보기
http -v '서버 띄운 로컬 주소' name=유저이름 email=이메일주소 password=비밀번호
- 입력한 데이터를 화면에서 확인할 수 있도록 views.py 안
get
메서드 수정
def get(self, request):
user_data = Users.objects.values()
# user_data는 query set 형태이므로 객체 형태로 만들어서 출력해주기 위해서는 list로 만들어주어야 함
return JsonResponse({'users':list(user_data)}, status=200)
참고) 서버 띄우기 python manage.py runserver 포트번호
후 로컬주소/포트번호/앱이름
으로 접속하면 입력한 데이터 확인 가능
어려웠던 점
csrf 에러가 발생해 settings.py 내 MIDDLEWARE
항목 중 csrf 관련 부분을 주석처리 했지만 계속 에러가 발생했다. 이거 때문인가? 저거 때문인가? 하면서 이것저것 설정을 바꾸다보니 403부터 500까지 다채로운 에러를 만났다. 하지만 문제는 오탈자 때문이었다. Users
로 작성했어야 하는 걸 User
로 작성했던 것… 에러 중 에러는 역시 휴먼에러다!