backend 10

Tutorial 5: Relationships & Hyperlinked APIs

현재 API 내의 관계는 기본 키를 사용하여 표현된다. 이 튜토리얼에서는 관계에 하이퍼링크를 사용하여 API의 응집력과 검색 가능성을 개선하겠다. API의 루트에 대한 엔드포인트 만들기 현재 '스니펫'과 '사용자'에 대한 엔드포인트는 있지만 API에 대한 단일 진입점이 없다. 이를 만들기 위해 일반 함수 기반 뷰와 @api_view 데코레이터를 사용할 것이다. snippets/views.py에 다음을 추가한다 # snippets/views.py from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework.reverse import reverse @api_view(['..

DRF Tutorial 2023.02.16

DRF Tutorial 4: Authentication & Permissions 3

object 수준의 권한 모든 스니펫을 누구나 볼 수 있도록 하되, 스니펫을 만든 사용자만 업데이트하거나 삭제할 수 있도록 하고 싶다면 이를 위해서는 사용자 지정 권한을 만들어야 한다. snippets 앱에서 permissions.py라는 새 파일을 만들자. from rest_framework import permissions class IsOwnerOrReadOnly(permissions.BasePermission): """ Custom permission to only allow owners of an object to edit it. """ def has_object_permission(self, request, view, obj): # Read permissions are allowed to an..

DRF Tutorial 2023.02.15

DRF Tutorial 4: Authentication & Permissions 2

스니펫을 유저와 연결하기 현재는 스니펫을 만들면 스니펫을 만든 유저를 스니펫 인스턴스와 연결할 수 있는 방법이 없다. 유저는 serialize된 값으로 전송되지 않고 들어온 요청(request)의 속성으로만 전송되기 때문이다. 이를 처리하기 위해 스니펫 view에서 .perform_create() 메서드를 재정의하여 인스턴스 저장이 관리되는 방식을 수정하고 수신 요청 또는 요청된 URL에 있는 모든 암묵적 정보를 처리할 수 있도록 하자. SnippetList 뷰 클래스에서 다음 메서드를 추가한다. # snippets/views.py class SnippetList(generics.ListCreateAPIView): queryset = Snippet.objects.all() serializer_class ..

DRF Tutorial 2023.02.15

DRF Tutorial 4: Authentication & Permissions 1

현재의 API에는 스니펫을 편집하거나 삭제할 수 있는 사용자에 대한 제한이 없다. 이를 확실히 하기 위해 몇 가지 고급 동작을 추가하자. 스니펫은 항상 작성자와 연결됨 인증된 사용자만 스니펫을 만들 수 있음 스니펫 작성자만 스니펫을 업데이트하거나 삭제할 수 있음 인증되지 않은 요청은 전체 읽기 전용 액세스 권한을 가짐 모델에 정보 추가하기 스니펫 모델 클래스를 몇 가지 변경하자. 먼저 몇 개의 필드를 추가한다. 그 중 하나는스니펫을 만든 사용자를 나타내는 데 사용된다. 다른 필드는 코드의 강조 표시된 HTML 표현을 저장하는 데 사용된다. models.py의 스니펫 모델에 다음 두 필드를 추가 # snippets/models.py owner = models.ForeignKey('auth.User', re..

DRF Tutorial 2023.02.15

DRF Tutorial 3: Class-based Views

함수 기반 뷰가 아닌 클래스 기반 뷰를 사용하여 API 뷰를 작성할 수도 있다. 이는 공통 기능을 재사용할 수 있고 코드를 깔끔하게 유지하는 데 도움이 되는 강력한 패턴이다. 클래스 기반 뷰를 사용하여 API 다시 작성하기 루트 뷰를 클래스 기반 뷰로 다시 작성하자. views.py를 약간 리팩터링 할 것이다. # snippets/views.py from snippets.models import Snippet from snippets.serializers import SnippetSerializer from django.http import Http404 from rest_framework.views import APIView from rest_framework.response import Respons..

DRF Tutorial 2023.02.14

DRF Tutorial 2: Requests and Responses 2

URL에 선택적 형식 접미사(optional format suffixes) 추가하기 응답이 더 이상 단일 콘텐츠 유형에 고정되어 있지 않다는 것을 활용하기 위해 API 엔드포인트에 형식 접미사 지원을 추가해 보자. 형식 접미사를 사용하면 특정 형식을 명시적으로 참조하는 URL이 제공되므로 API가 http://example.com/api/items/4.json 같은 URL을 처리할 수 있다. 다음과 같이 두 뷰에 형식 키워드 인수를 추가하자. def snippet_list(request, format=None): def snippet_detail(request, pk, format=None): 이제 snippets/urls.py 파일을 업데이트하여 기존 URL에 format_suffix_patterns ..

DRF Tutorial 2023.02.14

DRF Tutorial 2: Requests and Responses 1

이제부터 REST 프레임워크의 핵심을 본격적으로 다루기 시작하겠다. 몇 가지 필수 구성 요소를 소개한다. Request objects REST 프레임워크는 일반 HttpRequest를 확장하고 보다 유연한 요청 구문 분석을 제공하는 Request 객체를 도입했다. Request objects의 핵심 기능은 request.data 속성으로, request.POST와 유사하지만 웹 API 작업에 더 유용하다. request.POST # Only handles form data. Only works for 'POST' method. request.data # Handles arbitrary data. Works for 'POST', 'PUT' and 'PATCH' methods. Response objects..

DRF Tutorial 2023.02.14

DRF Tutorial 1: Serialization 3

시리얼라이저를 사용하여 일반 장고 뷰 작성하기 새로운 Serializer 클래스를 사용하여 몇 가지 API 뷰를 작성하는 방법을 살펴보자. 지금은 REST 프레임워크의 다른 기능을 사용하지 않고 일반 Django 뷰로 view를 작성할 것이다. snippets/views.py 파일에 다음 코드를 작성한다 from django.http import HttpResponse, JsonResponse from django.views.decorators.csrf import csrf_exempt from rest_framework.parsers import JSONParser from snippets.models import Snippet from snippets.serializers import SnippetS..

DRF Tutorial 2023.02.14

DRF Tutorial 1: Serialization 2

시리얼라이저로 작업하기 시리얼라이저와 친숙해지기 위해 Django 셸을 열어서 작업해보자. python manage.py shell 작업할 코드 스니펫을 몇 가지 만들어보자. from snippets.models import Snippet from snippets.serializers import SnippetSerializer from rest_framework.renderers import JSONRenderer from rest_framework.parsers import JSONParser snippet = Snippet(code='foo = "bar"\n') snippet.save() snippet = Snippet(code='print("hello, world")\n') snippet.save..

DRF Tutorial 2023.02.14

DRF Tutorial 1: Serialization 1

Django REST framework 문서의 튜토리얼을 따라하면서(번역하면서) DRF에 관한 내용들을 적을 예정 가상환경 세팅 새로운 프로젝트를 시작하기 전 새 가상환경을 만드는 것으로 시작한다. 이것은 작업 중인 다른 프로젝트와 잘 분리시키기 위함이다. python3 -m venv env source env/bin/activate 위의 코드로 가상환경을 생성하고 가상환경 안으로 진입하였다. 그 후 필요한 패키지들을 설치한다. pip install django pip install djangorestframework pip install pygments # We'll be using this for the code highlighting 프로젝트의 시작 작업할 프로젝트를 만들어준다. 프로젝트의 이름은 ..

DRF Tutorial 2023.02.13