본문 바로가기

Back-end/Django

초보자를 위한 Django REST Framework 과정

출처 : Parwiz

이 기사에서는 초보자를위한 Django REST 프레임 워크 과정에 대해 이야기 할 것입니다 . 또한 초보자를위한 Django REST 프레임 워크 과정에 대한 자세한 내용은이 기사의 전체 비디오를 확인할 수 있습니다.

 

RESTFull API 란?

RESTful API는 웹 서비스를 통해 통신하는 두 시스템 간의 변환기 역할을합니다. API 개념에 익숙한 경우 이것은 API와 비슷하지만 RESTful 웹 서비스에서 작동하며 API는 네트워크 또는 인터넷을 통해 서로 통신하려는 두 응용 프로그램에서 사용됩니다.
웹 개발자는 서버가 애플리케이션에서 데이터를받을 수있는 REST API를 프로그래밍합니다. 이러한 응용 프로그램은 웹 응용 프로그램, Android / iOS 응용 프로그램 등일 수 있습니다. RESTful API는 다양한 장치에서 해석 할 수있는 JSON 파일을 반환합니다.

 

Django REST 프레임 워크 란? 

Django REST 프레임 워크는 웹 API를 구축하기위한 강력하고 유연한 툴킷입니다.

REST 프레임 워크를 사용하려는 몇 가지 이유 :

  • 웹 브라우징 가능한 API는 개발자에게 큰 유용성입니다.
  • OAuth1a 및 OAuth2 용 패키지를 포함한 인증 정책.
  • ORM 및 비 ORM 데이터 소스를 모두 지원하는 직렬화.
  • 끝까지 사용자 정의 가능-더 강력한 기능이 필요하지 않은 경우 일반 기능 기반보기를 사용하십시오.
  • 광범위한 문서 및 훌륭한 커뮤니티 지원.
  • Mozilla, Red Hat, Heroku, Eventbrite 등 국제적으로 인정받는 기업에서 사용하고 신뢰합니다.

또한 더 많은 장고 기사를 읽을 수 있습니다.

1 :  장고 페이지 네이션 완성 예제

2 :  Django가 Gmail 계정으로 이메일 보내기 

3 :  Django에서 뉴스 애플리케이션 빌드 

4 :  Django 집계 예제

5 :  Django 사용자 인증 프레임 워크 

 

설치 

설치를 위해 pip를 사용할 수 있습니다.

 

pip install djangorestframework

 

 

설치 후 Django에서 새 프로젝트를 만들어야합니다. iam은 프로젝트 이름을 MyProject로 지정합니다.

 

django-admin startproject MyProject

 

이제 생성 된 프로젝트로 디렉토리를 변경해야합니다. 그런 다음 새 앱을 만든 후 iam은 내 앱을 api_basic으로 호출합니다.

 

pip install djangorestframework

 

 

또한 이와 같은 프로젝트의 수퍼 유저를 생성해야합니다.

 

python manage.py createsuperuser

 

 

이제 django settings.py 를 열고 설정 의 INSTALLED_APP에서 만든 앱과 함께 django rest_framework를 추가해야합니다.

 

INSTALLED_APPS = ( 
    ... 
    'rest_framework', 
     'api_basic',
)

 

API 빌드의 중요한 개념은 serializer입니다. 이제 생성 된 앱에 serializer.py라는 이름으로 새 python 파일을 만들어야합니다. 지금은이 파일에 아무것도 추가하지 않습니다.

 

 

 

Serializer 란? 

클라이언트에 데이터를 보내기 전에 데이터를 JSON으로 직렬화해야합니다. Web API를 시작하기 위해 가장 먼저 필요한 것은 데이터 인스턴스를 json. Django의 폼과 매우 유사하게 작동하는 serializer를 선언하여이를 수행 할 수 있습니다.

이제 모델을 생성 할 시간입니다. 이제 앱에서 models.py 파일을 열고이 코드를 추가해야합니다. 기본적으로 Article 모델을 생성 할 것입니다.

 

from django.db import models

# Create your models here.


class Article(models.Model):
    title = models.CharField(max_length=100)
    author =models.CharField(max_length=100)
    email = models.EmailField(max_length=100)
    date = models.DateTimeField(auto_now_add=True)


    def __str__(self):
        return self.title

 

 

 

위에서와 같이 설치된 앱에 rest_framework  추가했으며 새 모델도 만들었 으므로 이제 마이그레이션해야합니다.

 

python manage.py makemigrations

 

 

python manage.py migrate

 

 

이제 데이터를 추가하기 위해 django 슈퍼 사용자를 사용 하고 있으므로 admin.py에 모델을 추가 할 수 있습니다 .

 

from django.contrib import admin
from .models import Article

# Register your models here.


admin.site.register(Article)

 

이제 이미 생성 한 serializer.py 파일에 코드를 추가 하겠습니다. 사용할 수있는 여러 시리얼 저가 있습니다.이 단계를 단계별로 수행합니다.

 

 

이 방법을 사용하는 경우 seriaizer 파일에 모든 모델 필드를 지정해야합니다.

from rest_framework import serializers
from .models import Article



class ArticleSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=100)
    author = serializers.CharField(max_length=100)
    email = serializers.EmailField(max_length=100)
    date = serializers.DateTimeField()



    def create(self, validated_data):

        # Create and return a new `Article` instance, given the validated data.
        return Article.objects.create(validated_data)


    def update(self, instance, validated_data):

        #Update and return an existing `Article` instance, given the validated data.

        instance.title = validated_data.get('title', instance.title)
        instance.author = validated_data.get('author', instance.author)
        instance.email = validated_data.get('email', instance.email)
        instance.date = validated_data.get('date', instance.date)
        instance.save()
        return instance

serializer 클래스의 첫 번째 부분은 직렬화 / 역 직렬화되는 필드를 정의합니다. create() 및  update() 호출 할 때 방법을 만들거나 수정하는 방법을 완전히 본격적인 인스턴스 정의 serializer.save()

serializer 클래스는 Django Form 클래스 와 매우 유사  하며 required,  max_length 및 default. 과  같은 다양한 필드에 유사한 유효성 검사 플래그를 포함합니다  .

 

 

 

 

이제이 명령을 사용하여 django 셸을 엽니 다.

 

python manage.py shell

 

따라서 장고 셸에서 먼저 이러한 가져 오기가 필요합니다.

 

In [1]: from api_basic.models import Article

In [2]: from api_basic.serializers import ArticleSerializer

In [3]: from rest_framework.renderers import JSONRenderer

In [4]: from rest_framework.parsers import JSONParser

 

 

이제 기사를 생성하고 저장해야합니다.

 

In [5]: a = Article(title = 'New Article', author ='Parwiz', email = 'par@gmail.com', )
   ...: 

In [6]: a.save()

django 관리자 패널을 확인하면 새 기사가 있음을 알 수 있습니다. 또한 원하는만큼의 기사를 추가 할 수 있습니다.

 

 

 

이제 기사를 직렬화하겠습니다. 다시 django shell로 이동합니다.

 

In [9]: serializer = ArticleSerializer(a)

In [10]: serializer.data
Out[10]: {'title': 'Article Title', 'author': 'John', 'email': 'john@gmail.com', 'date':
 '2020-05-24T09:14:02.081688Z'}

 

 

이 시점에서 모델 인스턴스를 Python 기본 데이터 유형으로 변환했습니다. 직렬화 프로세스를 마무리하기 위해 데이터를  json.

 

In [11]: content = JSONRenderer().render(serializer.data)
    ...: content
Out[11]: b'{"title":"Article Title","author":"John","email":"john@gmail.com","date":"202
0-05-24T09:14:02.081688Z"}'

이제 이것은 직렬화 된 데이터입니다.

 

 

모델 인스턴스 대신 쿼리 셋을 직렬화 할 수도 있습니다. 이를 위해 우리는 단순히 many=True serializer 인수에 플래그를 추가합니다  .

 

Python

In [13]: serializer = ArticleSerializer(Article.objects.all(), many=True)
    ...: serializer.data

 

ModelSerializers

우리 ArticleSerializer 수업은 Article 모델 에도 포함 된 많은 정보를 복제하고 있습니다. 코드를 좀 더 간결하게 유지할 수 있다면 좋을 것입니다. 장고 모두 제공하는 것과 같은 방식으로  Form 클래스 및  ModelForm 클래스를 REST 프레임 워크가 모두 포함하는  Serializer 클래스,  ModelSerializer 클래스.

 

ModelSerializer 클래스를 사용하여 serializer를 리팩토링하는 방법을 살펴 보겠습니다. 

 

from rest_framework import serializers
from .models import Article



class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ['id', 'title', 'author']

 

새로운 Serializer 클래스를 사용하여 API 뷰를 작성하는 방법을 살펴 보겠습니다. 지금은 REST 프레임 워크의 다른 기능을 사용하지 않고 일반 Django 뷰로 뷰를 작성합니다.

 

이제 views.py를 열고이  코드를 추가하십시오.

 

from django.shortcuts import render
from django.http import HttpResponse, JsonResponse
from rest_framework.parsers import JSONParser
from .models import Article
from .serializers import ArticleSerializer



@csrf_exempt
def article_list(request):
    """
    List all code articles, or create a new Article.
    """
    if request.method == 'GET':
        articles = Article.objects.all()
        serializer = ArticleSerializer(articles, many=True)
        return JsonResponse(serializer.data, safe=False)

    elif request.method == 'POST':
        data = JSONParser().parse(request)
        serializer = ArticleSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)

 

 

 

이제 urls.py라는 이름으로 앱 (api_basic)에 새 python 파일을 생성합니다.

 

from django.urls import path
from .views import article_list

urlpatterns = [

    path('article/', article_list),


]

 

 

 

또한이 파일을 이와 같이 기본 urls.py에 추가해야합니다.

 

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('api_basic.urls'))
]

 

 

 

이제 프로젝트를 실행하십시오.

 

python manage.py runserver

 

 

이 URL로 이동하면이 결과를 볼 수 있습니다.

 

http://localhost:8000/article/

Django REST 프레임 워크

 

또한 PostMan을 사용하여이 URL을 입력 할 수 있습니다.

초보자를위한 Django REST 프레임 워크 과정

 

 

또한 기사를 게시 할 수 있습니다. 그러나 이미이 작업을 수행 했으므로 뷰 함수 상단에 csrf_exempt를 추가했는지 확인하십시오.

 

 

 

또한 개별 기사에 해당하고 기사를 검색, 업데이트 또는 삭제하는 데 사용할 수있는보기가 필요합니다. 이제 views.py를 열고 이와 같은 새로운보기 기능을 추가해야합니다. 그 전에 기사를 가져오고 게시하기위한보기 기능을 만들었지 만 이것은 기사를 삭제하고 업데이트하기위한 것입니다. 또한 이것들은 함수 기반 api 뷰라는 점에 유의하십시오. 그러나 우리가 클래스 기반 또는 일반 뷰를 사용할 때는 이러한 코드를 사용하지 않습니다.

 

@csrf_exempt
def article_detail(request, pk):
    """
    Retrieve, update or delete article.
    """
    try:
        article = Article.objects.get(pk=pk)
    except Article.DoesNotExist:
        return HttpResponse(status=404)

    if request.method == 'GET':
        serializer = ArticleSerializer(article)
        return JsonResponse(serializer.data)

    elif request.method == 'PUT':
        data = JSONParser().parse(request)
        serializer = ArticleSerializer(article, data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)

    elif request.method == 'DELETE':
        article.delete()
        return HttpResponse(status=204)

 

 

또한 urls.py를 열고이 새로운보기 기능을 urls.py에 추가해야합니다.

 

from django.urls import path
from .views import article_list, article_detail

urlpatterns = [

    path('article/', article_list),
    path('detail/<int:pk>/', article_detail),


]

 

 

이제 이것을 사용하여 특정 ID 기사를 검색하거나 기사를 업데이트하거나 기사를 삭제할 수 있습니다.

 

함수 기반 뷰에서 api_view () 데코레이터 사용

또한 함수 API 기반 뷰와 함께 데코레이터를 사용할 수 있습니다. 예를 들어 api_view ()를 사용할 수 있습니다.이 기능의 핵심은  api_view뷰가 응답해야하는 HTTP 메소드 목록을 취하는 데코레이터입니다. 또한이 데코레이터를 사용하면 django 탐색 가능한 API보기에 액세스 할 수 있습니다.

 

 

이제 views.py  함수를 이와 같이 변경할 것 입니다.

 

from .models import Article
from .serializers import ArticleSerializer
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status


# Create your views here.


@api_view(['GET', 'POST'])
def article_list(request):
    """
    List all articles, or create a new article.
    """
    if request.method == 'GET':
        articles = Article.objects.all()
        serializer = ArticleSerializer(articles, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = ArticleSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)




@api_view(['GET', 'PUT', 'DELETE'])
def article_detail(request, pk):
    """
    Retrieve, update or delete article.
    """
    try:
        article = Article.objects.get(pk=pk)
    except Article.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        serializer = ArticleSerializer(article)
        return Response(serializer.data)

    elif request.method == 'PUT':
        serializer = ArticleSerializer(article, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        article.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

 

 

 

당신이 이동하는 경우 에 http : // localhost를 : 8000 / 기사 /      당신이 게시 문서의 동일한 기능, 기사를 얻는 기사를 검색, 기사 및 업데이트 문서를 삭제와 장고 나머지 프레임 워크에서 검색 가능한 API를 볼 수 있습니다.

Django REST Framework Browsable API

 

클래스 기반 API보기

OK 지금까지 우리는 django rest 프레임 워크에 대한 몇 가지 기본 사항을 배웠고 API 뷰 기반 함수에 대한 몇 가지 예제를 만들었습니다. 이제 django의 클래스 기반 API 뷰에 대해 이야기 할 시간입니다. REST 프레임 워크는 APIView Django의 View클래스 를 하위 클래스로 만드는 클래스를  제공합니다  . 은 Using  APIView 클래스 것은 거의 정기적으로 사용하는 것과 같습니다  View 평소와 같이, 클래스, 들어오는 요청과 같은 적절한 핸들러 메소드에 전달됩니다  .get() 나  .post(). 또한 API 정책의 다양한 측면을 제어하는 ​​여러 속성이 클래스에 설정 될 수 있습니다.

 

 

OK 이제 views.py에 다시 변경 사항을 가져올 것입니다. 클래스 기반 API 뷰를 사용하면 해당 코드가 필요하지 않기 때문에 views.py에서 모든 코드를 제거했습니다.

 

from .models import Article
from .serializers import ArticleSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status


class ArticleAPIView(APIView):

    def get(self, request):
        articles = Article.objects.all()
        serializer = ArticleSerializer(articles, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = ArticleSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)



class ArticleDetails(APIView):

    def get_object(self, id):
        try:
            return Article.objects.get(id=id)
        except Article.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)


    def get(self, request, id):
        article = self.get_object(id)
        serializer = ArticleSerializer(article)
        return Response(serializer.data)



    def put(self, request,id):
        article = self.get_object(id)
        serializer = ArticleSerializer(article, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, id):
        article = self.get_object(id)
        article.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

 

 

 

또한 이제 우리는 클래스 기반 뷰를 사용하고 있기 때문에 urls.py 파일에 변경 사항을 가져와야 합니다.

 

from django.urls import path
from .views import ArticleAPIView, ArticleDetails

urlpatterns = [


    path('article/', ArticleAPIView.as_view()),
    path('detail/<int:id>/', ArticleDetails.as_view()),



]

 

당신이 이동하는 경우 에 http : // localhost를 : 8000 / 기사 /      당신이 게시 문서의 동일한 기능, 기사를 얻는 기사를 검색, 기사 및 업데이트 문서를 삭제와 장고 나머지 프레임 워크에서 검색 가능한 API를 볼 수 있습니다. 하지만 이번에는 클래스 기반 API보기를 사용했습니다.

 

 

일반보기 및 믹스 인

클래스 기반 뷰의 주요 이점 중 하나는 재사용 가능한 동작을 구성 할 수있는 방식입니다. REST 프레임 워크는 일반적으로 사용되는 패턴을 제공하는 미리 빌드 된 여러 뷰를 제공하여이를 활용합니다. REST 프레임 워크에서 제공하는 일반보기를 사용하면 데이터베이스 모델과 밀접하게 매핑되는 API보기를 빠르게 빌드 할 수 있습니다. 제네릭 뷰가 API의 요구 사항에 적합하지 않은 경우 일반 APIView 클래스 를 사용  하거나 제네릭 뷰에서 사용하는 믹스 인 및 기본 클래스를 재사용하여 재사용 가능한 제네릭 뷰 집합을 구성 할 수 있습니다.

 

 

 

이제 다시 views.py를 변경하고 이전 코드를 제거합니다.이 코드를 사용하여 데이터를 추가, 가져 오기, 업데이트 및 삭제할 수 있습니다. 또한 다른 기능에 대한 별도의 믹스 인이 있습니다. 예를 들어 CreateModelMixin을 사용할 기사를 게시하고, ListModelMixin을 사용하는 기사를 가져오고, 업데이트를 위해 UpdateModelMixin을 사용하고, 삭제를 위해 DestroyModelMixin을 사용할 수 있습니다.

 

from .models import Article
from .serializers import ArticleSerializer
from rest_framework import generics
from rest_framework import mixins



class GenericAPIView(generics.GenericAPIView, mixins.ListModelMixin, mixins.CreateModelMixin,
                     mixins.UpdateModelMixin, mixins.RetrieveModelMixin,
                     mixins.DestroyModelMixin):
    serializer_class = ArticleSerializer
    queryset = Article.objects.all()
    lookup_field = 'id'

  

    def get(self, request, id = None):

        if id:
            return self.retrieve(request)

        else:
           return self.list(request)

    def post(self, request):
        return self.create(request)

    def put(self, request, id=None):
        return self.update(request, id)

    def delete(self, request, id):
        return self.destroy(request, id)

 

 

또한 urls.py 파일을 변경해야합니다.

 

from django.urls import path
from .views import GenericAPIView

urlpatterns = [

    path('generic/article/<int:id>/', GenericAPIView.as_view()),

]

 

당신이 이동하는 경우 에 http : // localhost를 : 8000 / 일반 / 기사 /    당신이 게시 문서의 동일한 기능, 기사를 얻는 기사를 검색, 기사 및 업데이트 문서를 삭제와 장고 나머지 프레임 워크에서 검색 가능한 API를 볼 수 있습니다. 하지만 이번에는 일반적인 뷰와 믹스 인을 사용했습니다.

 

 

 

인증

인증은 들어오는 요청을 요청을 보낸 사용자 또는 서명 된 토큰과 같은 식별 자격 증명 집합과 연결하는 메커니즘입니다. 그런 다음 권한 및 제한 정책은 해당 자격 증명을 사용하여 요청을 허용해야하는지 결정할 수 있습니다. REST 프레임 워크는 즉시 사용할 수있는 다양한 인증 체계를 제공하며 사용자 지정 체계를 구현할 수도 있습니다. 인증은 항상보기의 맨 처음, 권한 및 제한 검사가 발생하기 전, 그리고 다른 코드가 진행되기 전에 실행됩니다. 기본 인증, 토큰 인증 및 세션 인증과 같이 사용할 수있는 다른 인증이 있습니다.

 

 

  • 기본 인증 :이 인증 체계는 사용자의 사용자 이름과 비밀번호로 서명 된 HTTP 기본 인증을 사용합니다. 기본 인증은 일반적으로 테스트에만 적합합니다.
  • 토큰 인증 :이 인증 체계는 간단한 토큰 기반 HTTP 인증 체계를 사용합니다. 토큰 인증은 기본 데스크톱 및 모바일 클라이언트와 같은 클라이언트-서버 설정에 적합합니다.
  • 세션 인증 :이 인증 체계는 인증을 위해 Django의 기본 세션 백엔드를 사용합니다. 세션 인증은 웹 사이트와 동일한 세션 컨텍스트에서 실행되는 AJAX 클라이언트에 적합합니다.

 

 

인증 설정을 위해 전역 적으로 사용하거나 Python 파일 내에서 사용할 수 있습니다. 전역 적으로 settings.py 파일에 DEFAULT_AUTHENTICATION_CLASSES를 추가 할 수 있습니다.

 

REST_FRAMEWORK = {

    'DEFAULT_AUTHENTICATION_CLASSES': [

        'rest_framework.authentication.BasicAuthentication',

        'rest_framework.authentication.SessionAuthentication',

    ]

}

 

참고 : 우리는 전역 적으로 사용하지 않지만 파이썬 파일 내에 인증 클래스를 추가하고 있습니다.

 

 

이제 views.py를 변경 하고 인증 클래스를 추가합니다.

 

먼저 필요한 클래스를 가져와야합니다.

 

from rest_framework.authentication import SessionAuthentication,TokenAuthentication, BasicAuthentication

from rest_framework.permissions import IsAuthenticated

 

 

 

이제 이것은 views.py에 대한 새로운 코드입니다.

 

from .models import Article
from .serializers import ArticleSerializer
from rest_framework import generics
from rest_framework import mixins
from rest_framework.authentication import SessionAuthentication,TokenAuthentication, BasicAuthentication
from rest_framework.permissions import IsAuthenticated



class GenericAPIView(generics.GenericAPIView, mixins.ListModelMixin, mixins.CreateModelMixin,
                     mixins.UpdateModelMixin, mixins.RetrieveModelMixin,
                     mixins.DestroyModelMixin):
    serializer_class = ArticleSerializer
    queryset = Article.objects.all()
    lookup_field = 'id'

    authentication_classes = [SessionAuthentication, BasicAuthentication]
    #authentication_classes = [TokenAuthentication]
    permission_classes = [IsAuthenticated]

    def get(self, request, id = None):

        if id:
            return self.retrieve(request)

        else:
           return self.list(request)

    def post(self, request):
        return self.create(request)

    def put(self, request, id=None):
        return self.update(request, id)

    def delete(self, request, id):
        return self.destroy(request, id)

 

토큰 인증에 대해 언급했지만 그렇게 사용할 수 있습니다. 이제 여기서는 세션과 기본 인증을 함께 사용했습니다. 먼저 세션 인증을 확인한 후 기본 인증을 확인합니다.

 

 

당신이 이동하는 경우 에 http : // localhost를 : 8000 / 일반 / 기사 / 6 / , 당신은 장고 나머지 프레임 워크에서 검색 가능한 API를 볼 수 있습니다. 그러나 이번에는 인증을 사용했기 때문에 데이터에 액세스 할 수 없습니다.

 

Django 인증 프레임 워크

 

 

토큰 인증의 경우 django 관리자 패널에서 수동으로 토큰을 생성 한 후 토큰을 사용하여 인증 할 수 있습니다.

 

 

 

뷰셋 및 라우터

ViewSet 클래스는 단순히  그 어떤 방법 핸들러를 제공하지 않습니다, 클래스 기반 뷰의 유형  등  .get() 이나  .post(), 대신 같은 조치를 제공  .list() 하고  .create(). 에 대한 메서드 핸들러는 메서드를 ViewSet 사용하여 뷰를 마무리 할 때 해당 작업에만 바인딩됩니다  .as_view() .

 

뷰셋을 구현하는 방법에는 여러 가지가 있습니다. 첫 번째 방법은 자신 만의 뷰셋을 작성하는 것입니다. 이제 views.py를 변경하겠습니다.

 

from .models import Article
from .serializers import ArticleSerializer
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework import status
from django.shortcuts import get_object_or_404




class ArticleViewSet(viewsets.ViewSet):

    def list(self, request):
        articles = Article.objects.all()
        serializer = ArticleSerializer(articles, many=True)
        return Response(serializer.data)


    def create(self, request):
        serializer = ArticleSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


    def retrieve(self, request, pk=None):
        queryset = Article.objects.all()
        article = get_object_or_404(queryset, pk=pk)
        serializer = ArticleSerializer(article)
        return Response(serializer.data)

 

 

 

또한 라우터를 추가해야합니다.

 

from django.urls import path, include
from .views import ArticleViewSet
from rest_framework.routers import DefaultRouter


router = DefaultRouter()
router.register('article', ArticleViewSet, basename='article')


urlpatterns = [

    path('viewset/', include(router.urls))

 
]

 

 

 

 

당신이 이동하는 경우 에 http : // localhost를 : 8000 / 뷰셋 / 기사 /   당신은 동일한 기능을 가진 장고 나머지 프레임 워크에서 검색 가능한 API를 볼 수 있지만이 시간 우리는 viewsets 및 라우터를 사용하고 있습니다.

Django REST 뷰셋 및 라우터

 

 

업데이트 및 삭제 기능을 사용하지 않았지만 직접 수행 할 수 있습니다.

 

 

자체 뷰셋을 작성하는 대신 기본 동작 집합을 제공하는 기존 기본 클래스를 사용하는 경우가 많습니다. 예를 들면 :

 

class ArticleViewSet(viewsets.ModelViewSet):
    """
        A viewset for viewing and editing article instances.
        """

    serializer_class = ArticleSerializer
    queryset = Article.objects.all()