django drf를 이용한 api 테스트

ChatGPT를 이용한 테스트는 어느정도 해본 것 같아서 근본적인 이해를 위하여 진행하였다.
이번 실습은 윈도우 기반 pc에서 진행되었다.

Django DRF

Django DRF란?

Django DRF테스트를 위한 환경설정

파이썬 가상화 설정

PS D:\gitea\django-rest-api-test> python -m venv ./venv
PS D:\gitea\django-rest-api-test> .\venv\Scripts\activate

패키지 설치

(venv) PS D:\gitea\django-rest-api-test> pip install django djangorestframework

프로젝트 시작

django-admin startproject rest_api_project .

앱 생성

(venv) PS D:\gitea\django-rest-api-test> python.exe .\manage.py startapp test_api

프로젝트 앱 등록

......
......

ALLOWED_HOSTS = ["*"]

......
......

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',  # DRF 추가 (필요 시)
    'test_api',  # 새로 생성한 앱 등록
]

Django DRF테스트를 위한 API 구성

프로젝트 urls.py와 앱의 models.py, serializers.py, views.py, urls.py 설정이 필요하다.

프로젝트 urls.py

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('test_api.urls')),  # test_api 앱의 URL 포함
]

앱 models.py

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

앱 serializers.py

Serializer는 Django의 모델을 JSON 데이터로 변환하는 역할을 합니다.
쉽게 말하면, Django 모델(데이터베이스) ↔ JSON(클라이언트 API 응답) 변환을 담당하는 도구입니다.

from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post  # 어떤 모델을 변환할지 설정
        fields = '__all__'  # 모든 필드 포함

'''
{
    "id": 1,
    "title": "첫 번째 글",
    "content": "이것은 테스트입니다.",
    "created_at": "2024-03-11T12:34:56Z"
}

'''

앱 vies.py

ViewSet은 CRUD 기능을 자동으로 처리하는 Django REST Framework의 강력한 도구입니다.
즉, ViewSet을 사용하면 GET, POST, PUT, PATCH, DELETE 기능을 자동으로 제공해 줍니다.

from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
ChatGPT참조.

앱 urls.py

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import PostViewSet  # test_api/views.py에서 가져옴

router = DefaultRouter()
router.register(r'posts', PostViewSet)  # '/api/posts/' 엔드포인트 생성

urlpatterns = [
    path('', include(router.urls)),  # API 라우팅 등록
]

서버 시작

python .\manage.py runserver 0.0.0.0:8000

RestAPI 테스트

restAPI.py

import requests

# Django REST API 주소 (로컬 서버 기준)
BASE_URL = "http://192.168.0.202:8000/api/posts/"

# 1️⃣ 게시물 하나 등록 (POST 요청)
post_data = {
    "title": "My First API Post",
    "content": "This is a test post created using Python requests library."
}

response = requests.post(BASE_URL, json=post_data)

if response.status_code == 201:  # 201 Created
    print("✅ 게시물이 성공적으로 등록되었습니다!")
    post_id = response.json().get("id")  # 생성된 게시물 ID 가져오기
    print("📌 생성된 게시물 ID:", post_id)
else:
    print("❌ 게시물 등록 실패:", response.status_code, response.text)

# 2️⃣ 게시물 조회 (GET 요청)
response = requests.get(BASE_URL)

if response.status_code == 200:  # 200 OK
    posts = response.json()  # JSON 데이터 파싱
    print("\n📜 현재 등록된 게시물 목록:")
    for post in posts:
        print(f"🆔 ID: {post['id']} | 📌 제목: {post['title']} | 📝 내용: {post['content']}")
else:
    print("❌ 게시물 조회 실패:", response.status_code, response.text)