
<Person>
<name>이름</name>
<age>30</age>
<hobby>
<element>축구</element>
<element>야구</element>
</hobby>
</Person>{name:"이름", age:30, hobby:["축구","야구"]}pip install djangorestframework
django-admin startproject 프로젝트이름 경로
python manage.py startapp 애플리케이션이름
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'apiapp'
]DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'rest',
'USER': 'root',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': ''
}
}TIME_ZONE='Asia/Seoul'python manage.py makemigrationspython manage.py migrate프로젝트에 여러 개의 애플리케이션이 존재하는 경우 프로젝트에서 모든 요청을 처리하도록 하면 프로젝트의 urls.py 가 너무 복잡해지므로, 요청을 처리하는 로직이나 url 설정을 애플리케이션 단위로 분할하는 것이 좋습니다.
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('example/', include('apiapp.urls'))
]
apiapp 디렉토리에 urls.py 파일을 추가하고 작성
from django.urls import path
from .views import helloAPI
urlpatterns = [
path('hello/', helloAPI)
]
apiapp 디렉토리의 views.py 파일에 helloAPI 함수를 추가
from django.shortcuts import render # 템플릿 엔진을 이용해서 HTML 출력에 사용
from rest_framework.decorators import api_view
from rest_framework.response import Response # JSON 데이터 생성에 사용
# GET 방식으로 온 요청만 처리
@api_view(['GET'])
def helloAPI(request):
return Response("Hello REST API")
확인
python manage.py runserver 127.0.0.1:80

애플리케이션의 models.py 에 Model 클래스를 상속받는 클래스 생성
from django.db import models
class Book(models.Model):
bid = models.IntegerField(primary_key=True)
title = models.CharField(max_length=50)
author = models.CharField(max_length=50)
category = models.CharField(max_length=50)
pages = models.IntegerField()
price = models.IntegerField()
published_date = models.DateField()
description = models.TextField()
변경 내용을 데이터베이스에 반영
python manage.py makemigrations
python manage.py migrate

apiapp 디렉토리에 Serializer 를 구현할 serializers.py 파일을 생성하고 작성
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['bid', 'title', 'author', 'category', 'pages', 'price', 'published_date', 'description']
전체 데이터 가져오기, 데이터 삽입, 1개 데이터 가져오기
from django.shortcuts import render # 템플릿 엔질을 이용해서 HTML 출력에 사용
from rest_framework.decorators import api_view
from rest_framework.response import Response # JSON 데이터 생성에 사용
from rest_framework import status
from rest_framework.generics import get_object_or_404
from .models import Book
from .serializers import BookSerializer
# 하나의 함수를 가지고 GET 과 POST 를 구분해서 처리
# GET:전체 데이터 가져오기, POST:데이터 삽입
@api_view(['GET','POST'])
def booksAPI(request):
if request.method == 'GET':
# 테이블의 전체 데이터 가져오기
books = Book.objects.all()
# 가져온 데이터를 JSON 문자열로 변환
serializer = BookSerializer(books, many=True)
# JSON 으로 출력
return Response(serializer.data, status=status.HTTP_200_OK)
elif request.method == 'POST':
# 클라이언트에서 전송된 문자열을 모델로 변환
serializer = BookSerializer(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'])
def bookAPI(request, bid):
book = get_object_or_404(Book, bid=bid)
serializer = BookSerializer(book)
return Response(serializer.data, status=status.HTTP_200_OK)
from django.urls import path
from .views import helloAPI, booksAPI, bookAPI
urlpatterns = [
path('hello/', helloAPI),
path('fbv/books/', booksAPI),
path('fbv/book/<int:bid>', bookAPI)
]

{
"bid":1,
"title":"REST API",
"author":"admin",
"category":"development",
"pages":3000,
"price":25000,
"published_date":"1970-05-30",
"description":"안녕하세요"
}

bid"

프로젝트의 urls.py 파일에 ajax 요청을 추가
from django.contrib import admin
from django.urls import path, include
# 추가
from apiapp import views
urlpatterns = [
path('admin/', admin.site.urls),
path('example/', include('apiapp.urls')),
# 추가
path('ajax/', views.ajax)
]
apiapp 디렉토리의 views.py 파일에 ajax 함수 추가
def ajax(request):
return render(request, "ajax.html")
apiapp 디렉토리에 templates 디렉토리를 생성하고, ajax.html 파일을 생성 및 작성
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ajax</title>
</head>
<body>
</body>
<script>
// ajax 객체를 생성
let request = new XMLHttpRequest();
// 전체 데이터를 가져오는 요청을 생성
request.open('GET', '../example/fbv/books/')
// 요청 전송
request.send('')
// 응답이 오면 호출될 함수를 등록
request.addEventListener('load', ()=>{
alert(request.responseText)
})
</script>
</html>
브라우저에서 "localhost/ajax" 를 요청해서 브라우저의 대화상자에 문자열이 출력되는지 확인

JSON Parsing
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ajax</title>
</head>
<body>
</body>
<script>
// ajax 객체를 생성
let request = new XMLHttpRequest();
// 전체 데이터를 가져오는 요청을 생성
request.open('GET', '../example/fbv/books/')
// 요청 전송
request.send('')
// 응답이 오면 호출될 함수를 등록
request.addEventListener('load', ()=>{
// 데이터 파싱
let data = JSON.parse(request.responseText)
// 데이터 사용
for (let idx in data){
alert(data[idx].bid)
}
})
</script>
</html>


POST 방식에 데이터를 포함시켜 전송
ajax.html 파일 수정
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ajax</title>
</head>
<body>
</body>
<script>
// ajax 객체를 생성
let request = new XMLHttpRequest();
// 새 데이터를 추가하는 요청을 생성
request.open('POST', '../example/fbv/books/')
// 전송할 데이터를 생성
let formdata = new FormData();
formdata.append('bid', 3);
formdata.append('title', '파이썬');
formdata.append('author', '귀도반로썸');
formdata.append('category', 'programming');
formdata.append('pages', 123);
formdata.append('price', 20900);
formdata.append('published_date', '2024-09-24');
formdata.append('description', '설명');
// 데이터를 헤더에 포함시켜서 전송
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
let param = ""
for (let pair of formdata.entries()){
param += pair[0] + '=' + pair[1] + '&'
}
// 요청 전송
request.send(param)
// 응답이 오면 호출될 함수를 등록
request.addEventListener('load', ()=>{
alert(request.responseText)
})
</script>
</html>
브라우저에서 요청 전송

데이터베이스에 데이터가 삽입되었는지 확인

콜백을 이용하는 것이 아니고 then 을 이용해서 비동기 요청을 수행
대다수의 응답이 JSON 으로 오기 때문에 파싱을 별도의 메서드로 처리하지 않고 응답 결과의 JSON 메서드 호출로 수행
전체 데이터 가져와서 출력하도록 스크립트 코드를 수정
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ajax</title>
</head>
<body>
</body>
<script>
fetch('../example/fbv/books/')
.then((response) => response.json())
.then((data)=>{
for(idx in data){
alert(data[idx].bid)
}
})
</script>
</html>
POST 방식에 데이터를 포함시켜 데이터 삽입 요청
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ajax</title>
</head>
<body>
</body>
<script>
// 데이터 객체 생성
const data = {
bid:4,
title:'자바',
author:'고슬링',
category:'프로그래밍',
pages:200,
price:38000,
published_date:'2024-09-24',
description:'OOP'
}
// 데이터 삽입 POST 요청
fetch('../example/fbv/books/', {
method:'POST',
headers:{
'Content-Type':'application/json'
},
body: JSON.stringify(data)
})
fetch('../example/fbv/books/')
.then((response) => response.json())
.then((data)=>{
alert(data)
})
</script>
</html>
브라우저에서 데이터 삽입 요청

데이터베이스에 데이터가 삽입되었는지 확인

코드를 단순화시켜서 비동기 통신을 수행
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ajax</title>
</head>
<body>
</body>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
axios.get("../example/fbv/books/")
.then((response)=>{
alert(response.data)
})
.catch((error)=>{
// 실패했을 때 처리
alert(error)
})
.then(()=>{
// 무조건 수행할 구문
alert("무조건 수행")
})
</script>
</html>