국회도서관 자료검색 서비스

django 공공데이터 포털 API 코드, 환경변수 설정, admin 생성하기 #9

유니네 라이브러리 2024. 8. 8. 13:28

Django에서 공공데이터 포털 API를 활용하여 데이터를 조회하고, 환경변수를 설정하며, 관리자 페이지를 생성하는 방법을 정리했다.

 

1. Django 코드 작성

 

이번 작업은 기존 프로젝트 구조를 유지하면서 진행한다.

 

코드 흐름

1. urls.py

  • API 경로는 /api/pubd/
  • 상세 URL은 pubdapp 앱 내부의 urls.py에서 관리

2. views.py

  • nanet_search() 함수 생성
  • nanet_post() 함수 생성

3. settings.py

  • Git에 공유되지 않아야 할 주요 키 값 저장

4. api.py

  • API 호출을 처리하는 함수 모음
  • axios와 연계되는 로직을 포함
  • nanet_api() 함수 생성

5. models.py

  • 요청(Request) 및 응답(Response) 데이터를 저장할 모델 Nanet 생성

☞ django 프로젝트 구조는 이전 글 참고

 

django cycle, 프로젝트 구조 및 language, timezone 변경하기 #3

django cycledjango는 아래와 같은 사이클로 작동되며, 소스 코드도 아래 사이클에 맞춰 개발한다.WSGI (Web Server Gateway Interface)파이썬 스크립트(웹 어플리케이션)가 웹 서버와 통신하기 위한 인터페이

yuneenelife.tistory.com

 

2. urls.py 설정

 

프로젝트 urls.py

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

# URL 패턴 설정
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('rest_framework.urls')),
    path('api/pubd/', include('pubdapp.urls')),  # 공공데이터 포털 API URL 모음
]

 

urls.py (pubdapp/urls.py)

from django.urls import path
from .views import nanet_search

# URL 패턴 설정
urlpatterns = [
    path('nanet_main/', nanet_search),  # 공공데이터 조회 URL
]

 

3. views.py 작성

from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny
from .api import nanet_api
from .models import Nanet

@api_view(['GET'])
@permission_classes([AllowAny])
def nanet_search(request):
    param = [
        request.GET.get('search'),
        request.GET.get('pageno'),
        request.GET.get('displaylines')
    ]

    # 로그 생성
    if param[0]:
        create_nanet_log(param)
    else:
        test_data = ['자체 테스트중', 1, 10]
        create_nanet_log(test_data)

    # API 호출
    response_data = nanet_api(param)
    return Response(response_data)

# 로그 생성 함수
def create_nanet_log(param):
    nanet_save = Nanet(search=param[0], pageno=param[1], displaylines=param[2])
    nanet_save.save()

 

4. 환경변수 설정 (settings.py)

 

Git에 공유되지 않아야 하는 API 키URL을 별도 환경변수로 관리한다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'corsheaders',
    'pubdapp',
]

# 공공데이터 포털 API URL
EXTERNAL_URLS = {
    'NANET_API': 'http://apis.data.go.kr/9720000/searchservice/basic',
}

# API 키
EXTERNAL_KEYS = {
    'NANET_KEY': '공공데이터 포털에서 받은 API KEY',
}

 

5. API 호출 함수 (api.py)

 

settings.py에서 설정한 환경변수를 가져와 API를 호출한다.

from django.conf import settings
from urllib.parse import urlencode, unquote, quote_plus
import requests, xmltodict

def nanet_api(param):
    url = settings.EXTERNAL_URLS['NANET_API']
    service_key = settings.EXTERNAL_KEYS['NANET_KEY']
    decoded_key = unquote(service_key, 'UTF-8')

    # 파라미터 검증
    validated_params = validation_api('nanet', param)
    if validated_params[0] == 'noapi':
        return False

    # API 요청 파라미터 조합
    query_params = '?' + urlencode({
        quote_plus('ServiceKey'): decoded_key,
        quote_plus('pageno'): validated_params[1],
        quote_plus('displaylines'): validated_params[2],
        quote_plus('search'): validated_params[0]
    })

    # API 호출
    response = requests.get(url + query_params)
    response_data = xmltodict.parse(response.text)
    
    return response_data

# 파라미터 검증 함수
def validation_api(api_name, param):
    try:
        if api_name == 'nanet':
            if param[0] is None:
                param = ['자료명,삼국지', 1, 10]
            else:
                param[0] = str(param[0])
        else:
            return ["noapi"]
        return param
    except Exception as e:
        print("ERROR validation_api()", e)

 

6. 필수 모듈 설치

 

1) requests 라이브러리 설치

 

API 요청을 위해 requests 모듈을 설치한다.

pip install requests

 

설치 완료 메시지 예시:

Successfully installed requests-2.32.3

 

2) xmltodict 라이브러리 설치

 

XML 데이터를 파싱하여 dict 형식으로 변환하기 위해 xmltodict를 설치한다.

pip install xmltodict

 

설치 완료 메시지 예시:

Successfully installed xmltodict-0.13.0

 

7. 모델 (models.py) 작성

 

API 요청 및 응답 데이터를 저장할 모델을 작성한다.

from django.db import models

class Nanet(models.Model):
    pageno = models.DecimalField(max_digits=4, decimal_places=0)  # 페이지 번호
    displaylines = models.DecimalField(max_digits=4, decimal_places=0)  # 페이지당 출력 개수
    search = models.CharField(max_length=500)  # 검색어
    create_date = models.DateTimeField(auto_now_add=True)  # 생성 날짜

 

데이터베이스 반영

python manage.py makemigrations
python manage.py migrate

 

8. Django 관리자(Admin) 설정

 

관리자 계정 생성

python manage.py createsuperuser

 

Django 서버 실행

python manage.py runserver

 

admin.py 설정

from django.contrib import admin
from .models import Nanet

admin.site.register(Nanet)

 

Admin 페이지 접속

  • Django 관리자 페이지: http://localhost:8000/admin/pubdapp/nanet/

django admin 관리자 페이지

  • API 조회 결과: http://localhost:8000/api/pubd/nanet_main/

공공데이터 자료검색 결과

 

9. 마무리

 

이번 포스트에서는 Django에서 공공데이터 포털 API를 호출하고 응답을 저장하는 기능을 구현했다.

다음 글에서는 API 요청/응답 문서를 관리하는 Swagger를 적용하는 방법을 다뤄본다. 🚀