PyCharm과 함께 DJango와 RestFramework를 활용하여 REST API 만들기

지난 포스팅에 이어, 이번에도 Django와 Django Rest Framework를 활용하는 방법에 대해 간단하게 알아보고자 합니다. 기본 사항은 이곳을 참고하세요.

이 포스팅은 이전 포스팅의 설정을 따릅니다.
Django 1.7.x 이하 버전에서는 migrate / makemigrations 명령이 존재하지 않습니다. 이는 마이그레이션 기능이 1.7.x 대 추가되어진 것으로, 이전 버전에서는 syncdb 를 통하여 이를 수행해야 합니다.
Django 1.7.x 이하 버전에서 관련 기능을 사용하려면 South 를 설치하셔야 합니다. 이는 다른 포스팅에서 다루겠습니다.

django 사용해 보기

긴 서론은 필요 없으니, 바로 들어가 볼까요?

지난 포스팅에 이어...
기본 설정이 모두 끝났다고 가정하고 살펴 봅시다. 지난 포스팅에서 url을 설정해 뒀었죠?
Run Task의 모습
PyCharm Professional Edition 을 사용한다면 Ctrl + Shift + R 키를 통해 Run Task 명령을 수행할 수 있습니다. 콘솔에서 사용한다면 django-admin 명령으로 수행 가능하구요. 간단하게 ‘블로그’ 앱을 만들어 봅시다. startapp 명령을 통해 블로그 ‘앱’을 하나 만들어 보겠습니다.
앱 이름을 입력하라고 나오네요~
앱의 이름을 입력해 달라고 합니다. 원하는 이름을 적도록 합시다.
이름 짓기
여기서는 간략하게 blog 라고 이름 지어 보겠습니다.
만들어진 앱의 모습
명령이 입력되고 나면, 하단에 어떤 명령이 수행되었는지 표시됩니다. 그리고 프로젝트에 blog 라는 앱 구조가 생성되어 있습니다. 기본적으로 admin.py / models.py / tests.py / views.py 가 각각 생성되게 됩니다.
모델을 만들어 보자!
가장 먼저 저희가 할 것은 Model 에 대한 정의 입니다. 모델은 일종에 데이터의 덩어리를 의미하는 것으로, 앱에서 사용할 데이터 덩어리를 만드는 작업이라고 생각하면 이해하기 쉽습니다.
설계하기
간략하게 블로그 포스트에 어떤 데이터가 필요한지 간략하게 설계를 해 보고,
모델 정의하기
기본 폼을 작성 합니다. django.db.models.Model 을 상속 받는 클래스를 정의하게 되면 django고 관리하는 하나의 데이터 모델이 나오게 됩니다.
필드 정의하기
앞에 정의 내린 간략한 내용을 기반으로, 모델의 구체 내용을 각각 서술 합니다. 각 항목들을 필드(Field) 라고 부르며, 데이타 베이스에서 하나의 칼럼과 같다고 보시면 됩니다. 제목과 내용은 문자열로 된 필드고, 작성 시간은 ‘자동으로 생성되고 / 현재 시간이 자동으로 기록되는’ DateTime 필드로 정의 내렸습니다.
마이그레이션 하기
일단 현재 내용을 DB에 적용을 해야 합니다. 이러한 작업을 마이그레이션(Migration) 작업이라고 합니다. DB와 Django 앱간의 데이터 모델을 동기화 시키는 것이라 볼 수 있습니다.
INSTALLED_APPS 에 추가하기
저희가 만든 앱인 ‘blog’는 아직 Django에서 관리하고 있지 않습니다. 이로 인하여 Django는 blog 앱의 model 데이터들을 migration 하지 않습니다. 저희가 만든 앱도 Django가 관리하게 하기 위해, settings.py에 INSTALLED_APPS에 blog 를 추가 시켜 줍시다.
마이그레이션 데이터 만들기
그 뒤, makemigrations 명령을 통해서 마이그레이션 데이터를 만들어줘야 합니다. Django가 해당 앱의 model을 추적하고 관리할 수 있는 데이터를 추출하고 관리하게 하기 위함 입니다.
마이그레이션 데이터가 만들어진 모습
해당 명령을 수행하면, Django가 데이터 모델을 추적하여 마이그레이션 데이터를 추출해 줍니다. 마이그레이션 파일은 해당 앱 내에 migrations 폴더 내에 위치하게 됩니다.
다시 마이그레이션 하기
마이그레이션 데이터를 적용해야 합니다. INSTALLED_APPS에 앱이 추가 되고, 해당 마이그레이션 데이터가 추가되면 마이그레이션이 가능하게 됩니다. migrate 명령을 통해 마이그레이션을 진행 합니다.
마이그레이션 성공한 화면
마이그레이션을 수행하면, 해당 내용을 토대로 마이그레이션을 진행 합니다. 마이그레이션 파일 구조는 추후에 따로 서술하겠습니다. 별 문제가 없다면 OK가 뜨고 종료 됩니다.
Shell에 접근하기
마이그레이션이 성공적으로 끝났다면, 해당 내용을 확인해 봐야 겠죠? 가장 쉽고 빠른 방법은 Django Shell 에 접근하여 데이터를 확인해 보는 것 입니다. shell 명령을 수행하여 쉘에 접근해 봅시다.
쉘에 접속한 모습
Django 쉘에 접속했습니다. 이제 저희가 만든 앱의 모델을 불러와서 간단하게 테스트를 해볼까요?
임포트 하기
Django 쉘을 실행하면, 기본적으로 프로젝트의 루트 폴더가 시스템 경로로 잡히게 됩니다. from blog.models import Post 명령으로 Post 모델을 불러 옵니다.
Post 객체 조회하기
models.Model 을 상속받은 객체들은 모델 기능들을 포함합니다. 간단하게 모든 객체를 조회하는(SELECT * FROM) 명령을 내려 봅시다. Post.objects.all() 을 입력해 보니, 아무런 데이터가 없어서 빈 리스트( [] ) 가 반환 되는걸 볼 수 있습니다. 무엇보다 작동이 되네요.
URL 설정하기
작동이 되는걸 알았으니, 쉘은 종료 하고… 이제 view를 구성해 봅시다. 먼저 view에 접근할 경로를 설정하기 위해 다시 urls.py 파일로 돌아 옵니다.
view 구성하기
그 전에! view를 먼저 구성해 봐야 겠죠? Django에서 views는 controller에 더 가깝습니다. 보이는 뷰의 의미보다는 뷰를 만들어준다는 의미가 더 큽니다. blog 앱에 있는 views.py 파일에 접근합시다.
view 구성하기
Django 에서는 View를 만드는 방법은 크게 2가지가 있습니다. 함수 기반 뷰(Function based view, view function)와 클래스 기반 뷰(Class-based view)로 나뉩니다. 다양한 처리를 위해서는 클래스 기반 뷰도 괜찮지만, 이 부분은 API 등에서 다루고… 지금은 간략하게 함수 기반 뷰를 하나 작성해 봅시다. blog_page라는 함수를 하나 만들고, 인자로는 request 를 포함합니다.
응답 보내기
이제 본문을 구성해 봅시다. Django로 정의한 URL로 요청이 오면, 해당 URL은 특정 함수를 부르게 됩니다. 그게 저희가 만들고 있는 함수가 될 것이고, 저희는 받은 요청을 처리하여 응답을 보내(return)주면 됩니다. 단 응답에도 여러가지 헤더가 포함되어져야 하는데, 이를 쉽고 간편하게 처리해주는 HttpResponse를 Django는 제공해 주고 있습니다. 따라서 저희는 간단하게 return HttpResponse(데이터) 모양으로 쉽게 응답을 보낼 수 있습니다.
URL 연결
이렇게 함수를 만들었고, 이제 URL에 연결(Dispatch) 해 줍시다. url 은 기본주소/blog/ 로 정의하도록 하겠습니다. 다른 URL을 참고하여 URL을 정의하고, blog_page라는 함수와 연결해 줍니다.
import를 추가한 모습
그리고 중요한 것은, 해당 함수는 다른 패키지에 있다는 사실 입니다. 따라서 from blog.views import blog_page 라는 임포트 명령을 통해 해당 함수를 가져와야 합니다.
테스트 하기
그리고 나서 디버깅을 돌려보면(계속 켜 두셨다면, Django가 알아서 리 로딩을 하여 갱신하였을 겁니다. Django 서버는 컴파일 에러가 아닌 이상 계속 상주하면서 자동으로 리로드 시켜 주거든요.), 쨔쟌! 결과가 나왔습니다.
모델 다뤄보기
이제는 저희가 만든 모델에 데이터를 넣고, 실제로 출력까지 해보는 예제를 작성해 볼까요?
임의의 데이터 넣기
다시 쉘로 접속하여, 임의로 데이터 하나를 만들어 봅시다. Model 클래스 안에는 craete 라는 기본 함수가 있는데, 이 함수를 사용하면 데이터를 만들어 넣을 수 있습니다.
확인하기
데이터가 정상적으로 추가되었는지 한번 확인해 볼까요? Post.objects.all()을 하니 아까와는 달리 Post 오브젝트가 1개 반환 되네요.
view 수정하기
이제 다시 views.py로 돌아가 내용을 추가해 봅시다. 지금까지 작성하던대로, post_list 중에 하나를 출력해 보는 코드를 작성합니다.
확인하기
그리고 확인하니…. 원하는 결과가 나왔네요? 후에 다루겠지만, Django Template(다른 MVC 패턴에서 View에 해당합니다.)와 함께 하면, 쉽고 빠르게 페이지를 구축하고 활용할 수 있습니다. 어느 웹 프레임워크나 비슷하겠지만요.
REST API를 만들어 봅시다!
이제는 본격적으로 REST API를 하나 만들어 봅시다. 이를 위해, url 하나를 추가 합시다. api/blog/ 를 GET 으로 접근하면, 모든 Post 데이터를 얻도록 해볼까요?
views 에 구성을 추가 합니다.
views 에도 REST API를 위한 클래스를 추가 합니다. 함수 기반으로 직접 추가해도 괜찮지만, 저희는 REST Framework를 통하여 쉽고 빠르게 확장을 할 것이므로…. 함수 기반이 아닌 클래스 기반으로 만들겁니다. GenericAPIView 를 상속받아서, 일반적인 REST API View를 하나 만듭니다. GenericAPIView는 as_view() 라는 함수를 가지고 있는데, 이 함수는 기본적인 REST Framework 웹 페이지를 하나 출력해 줍니다.
REST Framework 설정하기
REST Framework 를 사용하기 위해서는, 기본적으로 questset 이라는 멤버와 serializer_class 라는 멤버(또는 get_serializer_class() 라는 함수)를 제공해줘야 합니다. 이를 통해서 GenericAPIView는 기본적인 REST 기능을 수행할 수 있게 됩니다. 먼저 queryset은 어떠한 모델을 보여줄것인가? 를 정의 합니다. Post 데이터들을 보여줄 테니, 전체 Post 데이터를 반환 하게 합니다.
시리얼라이져 클래스 설정
그 뒤, serializer_class 는 PostSerializer 를 설정해 둡니다. 그리고 이 시리얼라이져를 구현해 봅시다.
시리얼라이져 정의하기
Serializer 는 REST 로 데이터를 주고 받을 때, 모델을 어떻게 주고 받을 것인가를 정의하기 위한 클래스 입니다. 저희는 데이터 모델 그 자체를 주고 받을 것 이니, 기본적으로 모델 전체를 자동으로 변환해주는 ModelSerializer 에 힘을 빌릴겁니다.
Meta 데이터를 정의하기
rest_framework.serializers 에 포함되어 있는 ModelSerializer 는 Meta 클래스를 요구합니다. 클래스 안에 Meta 클래스를 정의하는 것으로, ModelSerializer가 자신이 필요한 정보들을 파악하여 자동으로 Serialize 를 수행하게 될 것입니다. ModelSerializer는 다양한 메타 데이터를 포함할 수 있지만, model 데이터만을 넘겨줘도 저희가 쓰기에는 충분 합니다.
GET 호출에 대하여 정의하기
이제 GET 요청에 대한 처리를 구현할 차례 입니다. 기본적으로 REST Framework는 GET / POST / PATCH / DELETE 등의 요청에 대한 기본 처리를 제공해 줍니다. GenericAPIView 에서 각각 get / post / delete 등의 이름으로 정의가 되어 있습니다. 직접 처리하는 것도 방법이지만, GenericAPIView는 다른 Mixin 클래스와의 조합으로 쉽고 빠르게 구현하는 방법들을 제공 합니다. rest_framework.mixins 를 포함하고, ListModelMixins 라는 클래스를 다중 상속하여 해당 기능을 구현해 봅시다.
get 정의하기
다중 상속을 통해, GenericAPIView의 기능과 ListModelMixin의 기능을 같이 가져왔습니다. ListModelMixin은 GeneicAPIView에 queryset과 serializer_class를 기반으로 하여 데이터 List를 만들어주는 기능을 합니다. 먼저 get 을 정의해 봅시다. 기본적으로 REST Framework에서는 request, *args, **kwargs를 반드시 포함해서 처리하게 되어 있습니다. 기본적으로 온 요청에 대한 Parsing 작업을 하여 Request를 생성하고, 그 외에 여러 데이터는 *args와 **kwargs에 포함하여 오는 형태 입니다.
mixins 활용하기
ListModelMixin 클래스를 상속 받으면 list 라는 함수가 상속받아집니다. get 메소드에서 이를 호출하는 것으로, 기본적으로 목록 조회 기능을 요청할 수 있습니다.
URL 확인하기
최종적으로 URL내용을 확인해 보고…
url 적용 확인
제대로 적용 되었는지 확인하고,
테스트 하기
해당 REST Api를 호출하여 정상 작동하는지 확인해 봅시다. 잘 되네요!

마치며…

이렇게 Django와 REST Framework를 통하여 간단하게 웹 사이트를 구축해 봤습니다. 늘 원하는 데이터가 이렇게 심플하면 좋겠지만… 웹 사이트를 구축하고 API를 만들다 보면 복잡한 처리가 필요할때가 반드시 생기게 됩니다. 그 때는 조금 더 복잡한 기능들이나 해당 프레임워크 구조를 파악하여 커스텀을 좀 해야 하죠….

사용자 데이터와 Post 데이터를 혼합해서 Model을 만들었을 때, API는 어떻게 만들고 처리하지? 부터 더 복잡한 요건들은 얼마든지 나올 수 있습니다. 고로, 후에는 REST Framework를 커스터마이징 해서 쓰는 방법들에 대해서 하나하나 알아볼까 합니다.:)

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

 

[출처] https://devissue.wordpress.com/2015/02/03/pycharm%ea%b3%bc-%ed%95%a8%ea%bb%98-django%ec%99%80-restframework%eb%a5%bc-%ed%99%9c%ec%9a%a9%ed%95%98%ec%97%ac-rest-api-%eb%a7%8c%eb%93%a4%ea%b8%b0/

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
15 [python 데이터분석] [jupyter] 주피터 노트북에 이미지 삽입 file 졸리운_곰 2025.09.06 526
14 [python 데이터분석] [Python] Streamlit 사용법 (python 데이터분석 웹 만들기) file 졸리운_곰 2024.12.22 462
13 [python 데이터분석] Anaconda : Error while loading conda entry point: conda-libmamba-solver (libarchive.so.19: cannot open shared object file: No such file or directory) 졸리운_곰 2024.12.14 520
12 [python 데이터분석] Anaconda | Conda update 반영 안됨(update 후에도 버전 변경 없음) file 졸리운_곰 2024.11.18 431
11 [python 데이터분석] Keeping Anaconda Up To Date 졸리운_곰 2024.05.30 552
10 [python 데이터 분석] 국내 경제 100대 통계지표 졸리운_곰 2024.02.18 672
9 [python 데이터 분석] Python 에서 R언어 패키지 호출 : Calling R From Python With rpy2 file 졸리운_곰 2024.01.28 676
8 [python 데이터 분석] 파이썬을 활용한 코스피, 달러 환율정보 수집부터 차트 시각화까지 file 졸리운_곰 2023.12.11 735
7 [Python 데이터분석][pandas] [Python pandas] DataFrame의 문자열 칼럼을 숫자형으로 바꾸기 : pd.to_numeric(), DataFrame.astype() file 졸리운_곰 2023.12.09 357
6 [Python 데이터분석] [Python 환경설정] VS code 설치 및 Anaconda와 연동하기 file 졸리운_곰 2023.03.17 527
5 [Python 데이터분석][python 데이터분석 프로덕션] [Python] Docker를 사용한 Dash 웹앱 생성 file 졸리운_곰 2021.12.10 403
4 [Python 데이터분석] [pandas] 공공데이터(csv) 활용시 한글 깨짐 현상 해결 file 졸리운_곰 2021.09.30 592
3 [Python 데이터분석] 공공데이터포털::공휴일 데이터 조회 (REST API) file 졸리운_곰 2021.09.30 358
2 [Python 데이터 분석] pandas의 to_csv()를 사용해서 csv 파일로 저장하기(save 하기) 졸리운_곰 2021.09.29 603
1 [Python 데이터 분석] 데이터 과학을 단순하게 만드는 3가지 Python 패키지 file 졸리운_곰 2021.09.24 513
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED