REST API ?
HTTP의 동사(GET, POST, DELETE, PUT, PATCH)를 이용해 자원(URI)를 나타내는 방식
Djnago에는 DRF(Django Rest Framework)를 사용하여 REST API를 개발할 수 있다.
개발 순서
Model → Serializer → Views → URL
REST API를 개발하기 위해서 settings.py에 먼저 몇가지 항목을 추가한다.
INSTALLED_APPS = [
...
'rest_framework',
]
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
from rest_framework import serializers
from .models import Template
class TemplateSerializer(serializers.ModelSerializer):
class Meta:
model = Template
fields = '__all__'
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)
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()),
]
옴총나시군요!