[Django] REST API 개발

송현아·2021년 8월 23일
0

Django

목록 보기
1/4
post-thumbnail

🖱 DRF(Django Rest Framework)

REST API ?

HTTP의 동사(GET, POST, DELETE, PUT, PATCH)를 이용해 자원(URI)를 나타내는 방식

  • Djnago에는 DRF(Django Rest Framework)를 사용하여 REST API를 개발할 수 있다.

    • 개발 순서

      Model → Serializer → Views → URL

📎 settings.py

REST API를 개발하기 위해서 settings.py에 먼저 몇가지 항목을 추가한다.

  • Installed App에 rest_framework를 추가한다.
INSTALLED_APPS = [ 
	... 
	'rest_framework', 
]

📎 models.py

  • model을 이용해 Database의 ORM(Object Relational Mapping)을 설계한다.
from django.db import models

# 업로드 일자 / 파일명 / 설명 / 업로드 일자 
class Template(models.Model):
    upload_files = models.FileField(blank=False, null=False)
    name = models.CharField(max_length = 50, primary_key = True)
    description = models.CharField(max_length=200)
    uploaded_at = models.DateTimeField(auto_now_add=True)
    class Meta:
        # table name
        db_table = 'Templates'
  • 실행을 위한 명령어
$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py runserver

📎 serializers.py

  • model에서 설계한 ORM을 직렬화한다.
  • models 객체와 querysets 같은 복잡한 데이터를 JSON과 같은 데이터로 바꿔주는 역할을 한다.
from rest_framework import serializers
from .models import Template

class TemplateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Template
        fields = '__all__'

📎 views.py

  • views를 통해 로직을 설계

  • views를 구하는 방법은 두 가지(APIView, ViewSet)가 있다. 나는 APIView를 사용하였다. APIView를 이용한 CRUD는 GET, POST, DELETE, PUT이 있다.

from rest_framework.parsers import MultiPartParser, FormParser, JSONParser
from .serializers import TemplateSerializer
from rest_framework.viewsets import ViewSet 
from rest_framework.views import APIView 
from rest_framework.response import Response 
from rest_framework import status 
from django.http import Http404 
from django.shortcuts import get_object_or_404

class TemplateView(APIView):
	parser_classes = (MultiPartParser, FormParser)
		
	# upload template file
	def post(self, request, *args, **kwargs):
		serializer =TemplateSerializer(data=request.data)
		if serializer.is_valid():                        	
			serializer.save()
			response = Response(serializer.data, status = status.HTTP_201_CREATED)
			return response
		response = Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
		return response
            
    # delete all templates 
	def delete(self,request):
		templates = Template.objects.all()
		shutil.rmtree('./media/')
		templates.delete()
		response = Response("Delete All Templates Suceess!")
		return response
    
    # show all template information
	def get(self,request):
		templates = Template.objects.all()
		serializer =TemplateSerializer(templates,many=True)
		if templates:
			return Response(serializer.data)
		else:
			return Response("There is no Template File")
	
# Manage Specific Object 
class TemplateDetails(APIView):
	def get_object(self, name):
		try:
			return Template.objects.get(name=name)
		except Template.DoesNotExist:
			return Response(status=status.HTTP_404_NOT_FOUND)
	
	# show template content
	def get(self, request, name):
		templates = self.get_object(name)
		serializer = TemplateSerializer(templates)
		if 'json' in serializer.data['upload_files']:
			with open('.'+ serializer.data['upload_files'],"r") as f:
				content = json.load(f)
			return Response(content)
		else:
			return Response("Invalid File")

	# delete template information
	def delete(self, request, name):
		templates = self.get_object(name)
		serializer = TemplateSerializer(templates)
		os.remove('.'+serializer.data['upload_files'])
		templates.delete()
		return Response("Delete Template File",status=status.HTTP_204_NO_CONTENT)

📎 urls.py

  • urls를 통해 매핑
from django.conf.urls import url
from .views import TemplateView, TemplateDetails
from django.urls import path

urlpatterns = [
  	path('', TemplateView.as_view(), name='template_CRD'),
    path('<name>/', TemplateDetails.as_view()),  
]

2개의 댓글

comment-user-thumbnail
2021년 8월 24일

옴총나시군요!

1개의 답글