전체 글 373

장고(Django) GET

모든 Question에 대해 JSON 형식으로 조회할 수 있는 API 서버 기능을 하나씩 구현해 보려 합니다. 먼저 뷰 polls_api/views.py에 시작해보겠습니다. from django.shortcuts import render from rest_framework.decorators import api_view from polls.models import Question from .serializers import QuestionSerializer from rest_framework.response import Response # Create your views here. @api_view() def question_list(request): questions = Question.objects...

장고 (Django) 2023.11.04

장고(Django) ModelSerializer

Serializer를 매우 간단하게 만들기 QuestionSerializer가 serializers에서 Serializer대신 ModelSerializer를 상속 받도록 해줍니다. 필드의 정의와 create, update모두 지우고 class Meta를 작성합니다. model에 사용할 모델 Question을 fields에는 Question의 필드들을 선언합니다. 갑자기 등장한 Meta 클래스는 뭐죠? 클래스 안에 Meta 라는 이름의 클래스를 선언하는 것의 장고 만의 약속입니다. 클래스 안에 클래스를 선언하는 단순한 문법이며, 클래스 변수 문법을 통해 이해할 수 있습니다. 파이썬 고급 문법 중에 metaclass 문법와는 관련이 없습니다. 장고는 모델 클래스나 ModelForm 클래스에 대한 메타정보(설..

장고 (Django) 2023.11.04

장고(Django) 장고 쉘에서 Serializer 사용하기

만들었던 QuestionSerializer를 장고 쉘에서 사용해보자 장고 쉘에서 데이터를 업데이트할 때 시리얼라이저에서 업데이트 되었는지 쉽게 확인하기 위해 위의 블록 코드를 추가해줍니다. 학습을 위해 잠시 추가한 것이므로 실습이 끝나면 지워주세요. Serialization (직렬화) >>> from polls.models import Question >>> from polls_api.serializers import QuestionSerializer 먼저 Question 모델과 우리가 만든 시리얼라이저 QuestionSerializer를 import합니다. >>> q = Question.objects.first() >>> q q 변수에 Question 모델의 첫번째 데이터를 담습니다. q는 '휴가를 어..

장고 (Django) 2023.11.04

장고(Django) 시리얼라이저(Serilaizer)

시리얼라이저(Serilaizer)는? 장고 웹 프레임워크의 Serializer(직렬화)는 데이터베이스 모델의 데이터를 JSON 또는 다른 형식으로 변환하고, 반대로 JSON 데이터를 모델 객체로 역직렬화할 수 있는 도구입니다. 이는 웹 API 개발 및 데이터 교환을 간편하게 만드는 데 사용됩니다. Serializer의 주요 역할과 특징은 다음과 같습니다: 1. 모델 데이터를 JSON 또는 다른 형식으로 변환: Serializer를 사용하여 데이터베이스 모델의 객체를 JSON 형식으로 변환할 수 있습니다. 이렇게 변환된 데이터는 API 응답으로 클라이언트에 전송됩니다. 2. 역직렬화: Serializer는 JSON 데이터를 받아 데이터베이스 모델 객체로 역직렬화하는 데 사용됩니다. 이를 통해 클라이언트가 ..

장고 (Django) 2023.11.04

장고(Django) 결과(result) 조회 페이지

투표한 결과를 조회하는 화면 만들기 result.html 템플릿에서 어떤 question의 투표 결과를 조회하는 화면을 만들겠습니다. polls/views.py 뷰에서 result 메서드를 작성합니다. polls/urls.py result.html 템플릿의 path는 question의 id/result 가 URL로 입력시 views의 result로 연결하고 이러한 URL의 별칭은 result result.html result 템플릿을 위와 같이 작성 그런데 우리는 투표를 완료했을 때 Question의 목록들이 있는 index로 보대던 기존의 reverse대신 투표 직후 바로 득표 결과를 보여주는 result 페이지로 보내고 싶습니다. 그러기 위해 뷰의 vote 메서드를 수정하겠습니다. polls/view..

장고 (Django) 2023.11.03

장고 (Django) 에러 방어하기 2

만약에 복수의 서버에서 같은 요청을 동시에 실행한다면? 상황 하나를 가정해 보겠습니다. 현재 커피의 득표수는 99입니다. 그런데 서버1에서 A라는 사람이 커피에 한표를 투표하고 서버2에서 B라는 사람이 커피에 한표를 투표했습니다. 그러면 커피는 기존의 99에 2표를 더 얻어 커피의 득표수는 101이 되어야 합니다. 그런데 정말 우연히도 A와 B가 버튼을 동시에 클릭하고 서버가 이를 동시에 수행하는 극히 희박한 우연이 발생한다면 우리가 기존에 작성한 코드는 제대로 작동할까요?? 우리가 뷰에서 작성했던 코드입니다. 우리가 위에서 가정한 상황에서 서버1은 기존의 커피 득표수 99를 가져와 1을 더합니다. 서버2 역시 99를 가져와 1을 더합니다. 서비1은 메모리에 커피 득표수 100을 가지고 있고 서버2 역시..

장고 (Django) 2023.11.03

장고(Django) 에러 방어

투표를 고민하는 와중에 선택지사 삭제되었다면? 우리가 지난 시간 아무 것도 선택하지 않을 때는 KeyError가 일어나니 이를 try~except로 방어해줬었습니다. 그런데 Choice.DoesNotExist도 같이 에러 방어 코드로 작성해줬는데 왜 그랬을까요? question의 상세 페이지에 들어가 투표할 때는 무조건 존재하는 choice들만이 선택지로 제공될텐데 굳이 저렇게 Choice.DoesNotExist까지 방어 코드로 작성할 필요가 있을까 의문이 드실 수도 있습니다. 그런데 한 가지 상황을 가정해 보겠습니다. 만약 우리가 위와 같이 선택지를 고민하고 있는 와중에 커피라는 선택지가 DB에서 삭제된다면 어떻게 될까요? 그리고 그 상황에서 우리가 커피를 선택하고 Vote 버튼을 눌러 투표를 했다면 ..

장고 (Django) 2023.11.03

3주차 - 5 [특강] Git/GitHub

요약 1. Git은 분산환경을 지원하는 소스 버전 컨트롤 시스템, 공동개발과 버전관리의 편의를 위한 기능 2. GitHub은 Git을 언제 어디서나 사용할 수 있도록 Git에서 제공하는 클라우드 서비스다. 3. 처음에 Git과 GitHub를 혼동하는데 GitHub은 Git을 편리하게 이용하기 위한 수단 4. 인터넷에 대한 접근성과 컴퓨터 사양의 급개선으로 GitHub은 모든 개발자들의 필수 덕목이 되었다. 5. Mianline(보통 Main으로 지칭)과 이곳에서 뻗어 나와 프로젝트 팀원들의 개별적으로 수정하는 branch의 관리가 Git의 핵심 6. repository는 Git으로 관리하는 프로젝트 저장소 7. 많은 초보 개발자들이 두려워하는 CLI와 여러 기능들이 Git을 처음 익힐 때 방해요소로 작용..

데브코스 TIL 2023.11.03

장고(Django) 폼(Forms)

투표기능을 만들자 지금까지 우리가 작성한 상세 페이지는 해당 question의 choice가 무엇이 있는지 조회만 해볼 수 있었는데요. 이제는 question의 상세 페이지에서 choice를 직접 선택해 투표할 수 있는 기능을 만들어봅시다. 먼저 브라우저에서는 위와 같이 뜨는 투표창을 만들었습니다. 위와 같은 투표창을 만들기 위해 detail.html 템플릿에서 아래와 같이 코드를 작성했습니다. 갑자기 코드가 늘어났죠? 하나하나 설명해드리겠습니다. 먼저 빨간색 박스 action은 form에 입력된 데이터가 서버의 어떤 URL로 도착할지 적는 곳입니다. 현재는 실습의 초기단계기 때문에 일부러 #을 써서 비워뒀습니다. 파란색 박스 input 태그의 value는 대개는 초기값을 나타냅니다. 예를 들어 inpu..

장고 (Django) 2023.11.03

장고(Django) 404 에러 처리하기

404에러는 사용자가 웹 사이트에 존재하지 않는 URL을 요청하면 띄우는 에러입니다. 존재하는 question id 3번 대신 1000번을 입력하면 에러가 뜨는데 polls 앱의 views.py 파일의 위와 같이 음영처리된 코드를 실행하다 에러가 발생했다고 합니다. >>> question = Question.objects.get(pk=1000) Traceback (most recent call last): # (생락...) polls.models.Question.DoesNotExist: Question matching query does not exist. 쉘에서 코드를 똑같이 입력해보면 입력된 1000으로 Question의 id를 찾지 못했다는 뜻인데요. 개발자 도구 Network에서도 자세히 살펴보면..

장고 (Django) 2023.11.03