All Articles

django - django 기초 실습

장고 동작 원리 등 장고 기초 지식은 따로 포스팅하고, 오늘은 장고 실습 중 겪었던 우여곡절을 우선 기록한다.

실습 프로젝트 진행 순서

  1. 미니콘다 가상환경 생성 conda create -n 가상환경이름 python=버전
  2. 장고 설치 pip install django
  3. 프로젝트 생성 django-admin startproject 프로젝트명
  4. 앱 생성 python manage.py startapp 앱이름
  5. 메인 디렉토리 내 setting.py에서 INSTALLED_APPS 항목에 앱 추가 앱이름
  6. 앱 디렉토리 내 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)

  1. 앱 디렉토리에 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())
]

  1. 메인 디렉토리 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'))
]

  1. 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) # 시간 (업데이트 시간)
  ...

  1. DB 테이블에 반영하기 python manage.py makemigrationspython manage.py migrate

  1. 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)

  1. httpie로 데이터 입력해서 테스트 해보기

http -v '서버 띄운 로컬 주소' name=유저이름 email=이메일주소 password=비밀번호


  1. 입력한 데이터를 화면에서 확인할 수 있도록 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로 작성했던 것… 에러 중 에러는 역시 휴먼에러다!