Django에서 Naver API 활용하기
네이버 영화 API의 예제코드는 영화탭이 아니라 블로그 탭에 있다.
# 네이버 검색 API예제는 블로그를 비롯 전문자료까지 호출방법이 동일하므로 blog검색만 대표로 예제를 올렸습니다. # 네이버 검색 Open API 예제 - 블로그 검색 import os import sys import urllib.request client_id = "YOUR_CLIENT_ID" client_secret = "YOUR_CLIENT_SECRET" encText = urllib.parse.quote("검색할 단어") url = "https://openapi.naver.com/v1/search/blog?query=" + encText # json 결과 # url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText # xml 결과 request = urllib.request.Request(url) request.add_header("X-Naver-Client-Id",client_id) request.add_header("X-Naver-Client-Secret",client_secret) response = urllib.request.urlopen(request) rescode = response.getcode() if(rescode==200): response_body = response.read() print(response_body.decode('utf-8')) else: print("Error Code:" + rescode)
네이버 API 사이트에서 제공하는 예제코드를 초심자가 받아들이기에는 조금 어려운 면이 있었다. (Django에서는) 필요없는 os
나 sys
모듈도 넣어져있다.
이번 포스팅의 목표는 가장 기본적으로 동작하는 네이버 API코드다. 여기서 사용하는 최소한의 동작코드는 충분히 개선 여지가 있는 코드이며, 차차 개선해나갈 생각이다.
urls.py
from django.conf.urls import url from movie import views app_name='movie' urlpatterns = [ url(r'^search/', views.search, name='api_search') ]
views.py
import json import urllib.request from django.shortcuts import render def search(request): if request.method == 'GET': config_secret_debug = json.loads(open(CONFIG_SECRET_DEBUG_FILE).read()) client_id = config_secret_debug['NAVER']['CLIENT_ID'] client_secret = config_secret_debug['NAVER']['CLIENT_SECRET'] q = request.GET.get('q') encText = urllib.parse.quote("{}".format(q)) url = "https://openapi.naver.com/v1/search/movie?query=" + encText # json 결과 movie_api_request = urllib.request.Request(url) movie_api_request.add_header("X-Naver-Client-Id", client_id) movie_api_request.add_header("X-Naver-Client-Secret", client_secret) response = urllib.request.urlopen(movie_api_request) rescode = response.getcode() if (rescode == 200): response_body = response.read() result = json.loads(response_body.decode('utf-8')) items = result.get('items') pprint(result) # request를 예쁘게 출력해볼 수 있다. context = { 'items': items } return render(request, 'search/search.html', context=context)
가장 눈에 띄게 다른 점이 3가지가 있다.
-
client_id
와client_secret
네이버에서 발급받은 id와 secret키는 노출되면 안좋은 부분이 있기 때문에 따로
json
파일을 만들어서 로드(load)하는 방식을 사용했다.
-
q
라는 변수를 추가했다.q = request.GET.get('q')
<form action="{% url 'movie:api_search' %}" method="GET"> <input name="q" placeholder="검색할 단어를 입려하세요"> <input type="submit" value="검색"> </form>
검색버튼을 누르면 네이버 API에 정보검색을 요청해야 한다.
input
태그에q
를 붙인다.
-
예제코드의
request
의 변수 이름을 변경했다.movie_api_request = urllib.request.Request(url)
- serach 함수에서 이미
request
라는 파라미터를 받기 때문에 예제코드의 변수명과 겹친다.
변수 이름이 다소 길어지더라도, 명확하도록 변경했다.
- serach 함수에서 이미
-
request를
context
에 담았다.- 네이버 영화 API 검색 결과는 result라는 변수에 담긴다.
- result 내에
items
라는 항목에 우리가 원하는 정보들이 들어있다. - 우리가 진짜 원하는 정보들을 템플릿에 담아 보낼 거다.
{'display': 1, 'items': [{'actor': '안재홍|황승언|정우식|강봉성|황미영|', 'director': '우문기|', 'image': 'http://imgmovie.naver.com/mdi/mit110/1037/103797_P29_103649.jpg', 'link': 'http://movie.naver.com/movie/bi/mi/basic.nhn?code=103797', 'pubDate': '2013', 'subtitle': 'The King of Jokgu', 'title': '<b>족구왕</b>', 'userRating': '8.56'}], 'lastBuildDate': 'Fri, 22 Sep 2017 12:33:09 +0900', 'start': 1, 'total': 1}
templates.html
<h1> 네이버 영화 검색 API</h1> <form action="{% url 'movie:api_search' %}" method="GET"> <input type="text" name="q" placeholder="검색"> <input type="submit" value="검색"> </form> <div> {% for item in items %} <ul> <div>{{ forloop.counter }} <img src="{{item.image}}" alt="" width="110" height="150"> : {{ item.title|safe }} ( {{item.pubDate}} ) : {{ item.director }} : {{ item.actor }} 평점 : {{ item.userRating }} &llt;/div> </ul> {% endfor %} </div>
설명해야 할 부분은 2가지 정도로 보인다.
{% url 'movie:api_search' %}
app_name='movie' urlpatterns = [ url(r'^search/', views.search, name='api_search') ]
<app_name>:<url_name>을 사용하면 태그를 명시화할 수 있다.
{{ items|safe }}
- 이스케이프 문자(공백)를 출력하지 않는다.
출력결과는 자신이 원하는 것만 뽑아 내면 된다. 나는 모든 정보가 필요할 것 같아서 일단 다 써놓긴 써놨다.
네이버에서 제공하는 정보는 아래에 더 잘 나와있다.
마무리
위에서도 언급했듯이, 충분히 개선여지가 남아있는 코드들이다. 이를 개선하는 코드들도 추후 포스팅하고자 한다.
또한, 네이버에서 검색
에 해당하는 API들은 모두 비슷비슷하다. 하나만 잘 익혀두면 나머지도 손쉽게(?) 활용할 수 있을 것이다. 본 포스팅을 보면서 이해가 잘 안되시는 부분은 피드백 해주쉬면 감사하겠습니다.
'프로그래밍 > Django' 카테고리의 다른 글
[Django] 폼(Form)에서 commit=False의 의미 (1) | 2017.07.29 |
---|---|
[Django] Django allauth 유저 모델 커스텀하기 (0) | 2017.07.22 |
[Django] Django-allauth를 통한 페이스북 회원가입 및 로그인 (2) | 2017.07.20 |
[DJango] AbstractBaseUser vs AbstractUser 비교하기 (0) | 2017.07.15 |
[Django] Django + Celery + Redis 이용하기 (5) | 2017.07.15 |