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/
- API 조회 결과: http://localhost:8000/api/pubd/nanet_main/
9. 마무리
이번 포스트에서는 Django에서 공공데이터 포털 API를 호출하고 응답을 저장하는 기능을 구현했다.
다음 글에서는 API 요청/응답 문서를 관리하는 Swagger를 적용하는 방법을 다뤄본다. 🚀
'국회도서관 자료검색 서비스' 카테고리의 다른 글
django Test 코드 작성하여 코드 안정성 높이기 #11 (0) | 2024.08.12 |
---|---|
django rest framework swagger drf_yasg 설정 #10 (0) | 2024.08.09 |
django APP들을 위한 마이그레이션(migrate) 작업#8 (0) | 2024.08.07 |
pylint 로 python 가상환경 venv 코드와 vs code 와 연결시키기 #7 (0) | 2024.08.06 |
django cors 크로스 도메인 오류 해결 #6 (0) | 2024.08.05 |