Django 15. API

 Django 15. API


1. 라이브러리 임포트

pip install djangorestframework 


2. settings.py 설정


Installed_APPS 배열에 'rest_framework' 추가

INSTALLED_APPS = [
. . .
# 추가
'rest_framework',
]





3. 모델 생성


앱 폴더 안의 models.py 파일에 사용할 모델 클래스 작성


참고 : https://kumioriscodingdiary.blogspot.com/2023/07/django-10-db.html


* 예시

from django.db import models

class Item(models.Model):
name = models.CharField(max_length=100)
description = models.TextField(max_length=300)
cost = models.IntegerField()




4. Serializer 생성

모델의 데이터를 json 타입으로 변환해줌 -> 직렬화 작업


앱 폴더에 serializers.py 파일 생성


rest_framework의 serializers 임포트

models.py의 모델 클래스 임포트


serializers.ModelSerializer 클래를 상속받는 클래스 정의


내부 클래스로 Meta를 정의

멤버변수 model에 사용할 모델 클래스 지정

fields 멤버변수에 사용할 테이블의 항목들을 배열로 전달 (모든 항목을 이용하려면 "__all__" 전달)


* 예시

from rest_framework import serializers
from .models import Item

class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = "__all__"


5. views.py 생성

cbv 방식


rest_framework의 viewsets 임포트 해서 viewsets.ModelViewSet를 상속받는 클래스 작성

멤버 변수 queryset 에 사용할 쿼리문 지정

멤버 변수 serializer_class에 사용할 ModelSerializer 클래스 지정


* 예시

from django.shortcuts import render
from rest_framework import viewsets
from .serializer import ItemSerializer
from .models import Item

class ItemViewSet(viewsets.ModelViewSet):
queryset = Item.objects.all()
serializer_class = ItemSerializer





6. urls.py 구현


프로젝트 폴더의 urls.py 에서 앱 폴더의 urls.py로 연결


* 예시

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


urlpatterns = [
path('admin/', admin.site.urls),
path("", include("api.urls"), name="api"),
]



- 앱 폴더의 urls.py 설정

rest_framework의 routers 임포트

routers.DefautlRouter 클래스의 인스턴트 생성

생성한 인스턴스의 register 함수에 이름과 사용할 ViewSets 클래스 전달


* 예시

from rest_framework import routers
from . import views


router = routers.DefaultRouter()
router.register("Item", views.ItemViewSet)


urlpatterns 배열의 path에 include(router.urls) 지정 -> 자동으로 url 설정을 해줌


서버를 실행하고 접속하면 자동으로 생성된 UI에서 데이터에 접근 가능

GET, POST, DELETE, PUT 가능


<실행결과>












7. 웹 페이지에서 api 정보 받아오기


- JavaScript를 이용해서 정보 받기

fetch() 함수 이용.  () 안에 받아올 api의 url 전달


 * 예시

<h1>Hello World</h1>

<p id="name"></p>
<p id="des"></p>
<p id="cost"></p>

<script>
    fetch("http://127.0.0.1:8000/Item/1")
.then((response) => response.json())
.then((data) => {
document.getElementById("name").innerHTML = data["name"]
document.getElementById("des").innerHTML = data["description"]
document.getElementById("cost").innerHTML = data["cost"]
})
</script>



* CORS 에러 


다른 도메인에서 api 에 요청하면 브라우저에서 CORS 에러를 발생시킴


- 해결법

pip install django-cors-header


 settings.py 파일에서 설정

INSTALLED_APPS 배열에 'corsheaders' 추가


INSTALLED_APPS = [
    . . .
# 추가
'corsheaders',
]


MIDDLEWARE 배열의 가장 상단에 'corsheaders.middleware.CorMiddleware' 추가

MIDDLEWARE = [
# 추가
'corsheaders.middleware.CorsMiddleware',
. . .
]


CORS_ORIGIN_WHITELIST 배열에 요청을 허용할 호스트들을 추가하거나 모든 요청을 허용하려면 CORS_ORIGIN_ALLOW_ALL 를 TRUE로 설정

CORS_ORIGIN_ALLOW_ALL = True


-> 서버를 실행하고 웹 페이지에서 api에 요청하면 정상적으로 정보를 받을 수 있음


<실행결과>

















댓글

이 블로그의 인기 게시물

Spring Boot 6. 계시판 프로젝트

Spring Boot 2. Maria 데이터베이스 & Spring Data JPA

Django 10. DB 연동