Link
05-08 03:21
«   2021/05   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
Archives
Today
225
Total
1,526,350
관리 메뉴

꿈 많은 사람의 이야기

파이썬 Django REST API 개발 - 1편. djangorestframework 설치 및 셋팅 본문

python-django

파이썬 Django REST API 개발 - 1편. djangorestframework 설치 및 셋팅

오키여 이수진의 블로그 2019. 7. 25. 14:33
반응형

완성된 코드는 아래 github 주소에 있습니다!

도움이 되셨다면 좋아요와 깃허브 스타를 눌러주세요! 저에게 있어 큰 힘이 됩니다 ㅠㅠhttps://github.com/lsjsj92/django_todo_app

 

 

파이썬 장고(django)로 웹 개발하는 시리즈를 오랜만에 올립니다.

이미 내용은 다 있지만 블로그에 올릴 시간이 없었네요 ㅎㅎ

지난번 내용은 장고와 Ajax를 연동시켜서 웹 개발을 하는 것까지 진행했습니다.

(https://lsjsj92.tistory.com/490)

 

이번 포스팅부터는 django와 REST API를 연동하는 작업을 진행하려고 합니다.

REST API는 굉장히 많이 들어보셨을겁니다. RESTful API 라고도 하죠.

 

REST API는 HTTP의 기능도 지원해줘서 HTTP의 장점이 그대로 적용이 됩니다.

REST는 자원의 이름(resource name)을 가지고 클라이언트와 서버가 통신하는 방법을 뜻합니다.

약자가.. REpresentational Stateful Transfer였나? 아마 그랬을겁니다.

 

파이썬 장고에서는 이 REST API를 정말 쉽게 연동할 수 있습니다.

이미 라이브러리가 제공되고 있기 때문이죠!

 

자 그럼 시작해볼까요?

 

 

먼저 pip install djangorestframework를 입력해서 django rest api를 설치해줍니다.

 

아! 그리고 여기서 주의하셔야 할 것이

 

실제 장고(django) 서버와 REST 서버는 따로 운영이 되어야 합니다.

즉, 2개가 실행되고 있어야 한다는 것이죠!

 

 

그러면, 또 다른 project를 하나 만듭니다. 이 프로젝트는 저는 todoSubject_restfulAPI 라고 하겠습니다.

그리고 app도 하나 만들어줍니다.

저는 이 app을 todo_subject_restful_main 이라고 명명하겠습니다.

이 포스팅은 쭈욱 진행되고 있는 내용이 todo 게시판을 만드는 것이기 때문입니다.

todo board를 만드는데 있어 기존에는 그냥 DB와 연동했다면 이제 rest api와 연동하는 것이니까요

 

python manage.py startapp todo_subject_restful_main 이라고 합니다.

 

 

자! 그러면 project setting.py에 들어가보면 위와 같은 구역이 있을탠데요

여기서 INSTALLED_APPS에다가 rest_framework를 추가해줍니다.

그리고 아까 만들었던 app도 추가해줍니다.

 

 

 

그리고 추가했던 app에 보시면 serializers.py가 있어요

이 시리얼라이저(serializers)는 시리얼라이즈(serialize)라고도 불리우는데요.

이것은 객체와 같은 보기 힘든 데이터를 JSON이나 XML처럼 보기 쉽게 데이터를 바꾸어 통신하게 해주는 역할을 합니다.

그래서 여기 serializers.py에다가 시리얼라이저를 설정해주어야 어떤 데이터를 통신할 지 설정할 수 있는 것이죠!

REST API를 만들 때 필수적입니다. 데이터를 통신해줘야 하니까요

 

 

저는 serializers.py에다가 위와 같이 썼습니다. 

from rest_framework import serializers를 한 뒤 HyperlinkedModelSerializer를 상속해줍니다.

그 이후 model은 TodoList를 설정해줍니다. 통신할 모델을 설정해주는 것이죠

그리고 필드는 title, content와 같은 통신할 데이터 필드를 설정해주면 끝!

 

 

그리고 아까 만들었던 app에 해당되는 models.py에 들어갑니다.

여기에 models에 대한 설정을 해주면 됩니다.

그럼 여기에 설정한 model을 가지고 serializer 통신을 하게 됩니다.

 

 

그리고 views.py로 넘어갑니다.

view에서는 방금 만들었던 serializer와 model을 연동시켜줍니다.

rest_framework에 있는 viewset에서 modelViewSet을 가져와서 연동시켜줍니다.

 

 

다음은 urls.py입니다.

여기서는 rest_framework에서 routers를 가져옵니다.

그리고 todo_board라는 이름으로 views에 있는 방금 만들었던 view에 있는 클래스를 연동시켜주죠

 

자! 이제 이 프로젝트를 실행시켜줍니다

 

python manage.py runserver나 아니면 nginx 등을 하고 있으면 다른 것으로 할 수 있겠죠

아무튼 실행시켜줍니다!

 

 

그러면 위와 같은 화면이 나옵니다

신기하죠? 그냥 지원이 됩니다 이런 화면이 ㅎㅎ

이게 장고의 장점이지 않을까 싶습니다.

 

근데 우리가 원하는 데이터가 보이지 않네요?

아까 저희가 model.py를 통해서 model을 연동시켰죠?

근데 model은 연동시켰는데 막상 mysql과 연동은 안시켜놨습니다

 

 

그래서 setting.py에서 pymysql을 이용해서 mysql과 연동해줍니다.

 

 

이렇게 정보를 입력해주고요~

다시 실행시켜줍니다.

 

 

그리고 다시 보면 http://localhost:8088/todo"라고 적혀져있죠?

저대로 입력해봅니다

 

 

그러면 이렇게 나오는 것을 확인할 수 있습니다!

이 화면이 rest api의 R 부분이라고 보시면 됩니다

READ 부분이죠. 전체 데이터를 볼 수 있습니다.

그 외 CREATE(INSERT), UPDATE 등도 가능합니다.

기능을 추가해야겠지만요 ㅎㅎ 아무튼 가능합니다.

 

 

실제 insert를 해볼까요? 위 처럼 데이터를 입력해서 넣습니다.

POST는 REST API에서 INSERT에 해당됩니다.

PUT이 UPDATE이죠 ㅎㅎ

 

 

이렇게 하면 실제 DB에 들어간 것을 볼 수 있습니다.

 

 

그리고 파이썬에서 requests 라이브러리를 사용해서 통신을 해 가져오면 이렇게 가져오는 것을 볼 수 있습니다.

자! 여기까지 파이썬 django를 활용해서 rest api를 연동시킨 작업입니다.

이제 다음 포스팅에서 진행했던 todo app을 rest api 버전으로 바꿔보겠습니다!

728x90
반응형
14 Comments
  • 프로필사진 gosguy 2020.02.16 13:51 안녕하세요 장고 입문자입니다.
    왜 장고서버와, rest 서버는 따로 운영되어야 하나요?
    같이 운영해도 되지 않나요?
  • 프로필사진 오키여 이수진의 블로그 2020.02.16 18:33 신고 안녕하세요~
    네 물론 같이 운영해도 됩니다. 하지만 REST API의 장점은 Application과 API를 분리할 수 있다는 장점이 있어요. 그래서 저렇게 분리해서 사용합니다.
    더 궁금하시면 REST API에 대해서 공부해보시면 될 것 같습니당~
  • 프로필사진 서예은 2020.03.05 00:48 안녕하세요 ! 마지막 부분질문인데요
    my sql 연동 과저에서 import pymysql

    pymysql.install_as_MySQLdb()

    DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    'USER':'root',
    'PASSWORD':'1234',
    'HOST' : '127.0.0.1',
    'POST': '3306'

    }
    }

    이 과정을 따랐음에도 localhost:8088: todo 이게 안나오네요.. 왜그럴까요??
  • 프로필사진 오키여 이수진의 블로그 2020.03.05 10:34 신고 안녕하세요.
    음 이 글은 과거에 글부터 이어져서 시리즈로 나온 글입니다.
    그때 넣었던 데이터들과 db 구조들이 있는데 그거에 맞춰야해요 ㅠㅠ

    제 깃허브에 관련 db자료들이랑 다 있으니 그것 넣어보세요!
  • 프로필사진 빰빰 2020.03.11 21:04 안녕하세요 1편부터 글 잘 보고 있습니다 :)
    현재 python3 로 진행중인데요, 에러가 난다거나 그런건 아니고
    startapp을 실행했는데 기본 파일에 serializer.py가 없네요 직접 생성해서 프로젝트 진행중이긴한데 영 찝찝해서 질문드려요

    python3의 장고에 변경된 부분이 있을깓요?
  • 프로필사진 오키여 이수진의 블로그 2020.03.12 12:10 신고 안녕하세요.
    저도 제가 만들었던 것으로 기억합니다.
    아마 기본 파일엔 없는게 맞을겁니다!
  • 프로필사진 ggpass 2020.03.12 16:45 보다가 궁금한점이 있어 댓글 남깁니다!

    본문에는 db 연결하시자마자 바로 메인에서 "todo": "local~/todo" 이렇게 뜨시는데
    /todo 관련해서 urls를 작성한 적이 없는데 어떻게 localhost:8088/todo/ url이 생성될 수가 있나요?
  • 프로필사진 오키여 이수진의 블로그 2020.03.12 20:00 신고 안녕하세요.

    아.. 이 본문에는 그 내용이 없습니다 ㅠㅠ
    이게 REST API 내용을 담기 전에 DB와 다이렉트로 연결해서 진행하는 부분부터 시작한 글입니다.
    즉, 시리즈로 연재된 글이에요.
    그래서 django todo app 개발한 것 처음부터 보시면 그때 만들었을겁니다 ㅠㅠ
  • 프로필사진 장고 2020.11.04 02:38 1. serializer에서 어떤 데이터를 통신할지 설정할 때 model = 'OO'이라고 설정하잖아요. 이때 모델은 api에 있는 새로 생긴 모델파일을 말하는건가요? 아니면 기존의 장고 앱의 모델파일을 말하는건가요? 전자를 말하는 거면 새로 생긴 api의 models.py에 기존 앱에 있던 models.py를 복붙하면 되나요?
  • 프로필사진 오키여 이수진의 블로그 2020.11.05 21:42 신고 안녕하세요. 제가 요즘 좀 많이 바빠서 답장이 늦었습니다.

    model = 을 설정하는 부분은 models.py에 있는 class를 기반으로 설정합니다.
    models.py에 TodoList라는 클래스가 있는데 이게 DB 테이블과 매핑이 됩니다.
  • 프로필사진 장고 2020.11.04 02:39 2. 1의 질문과는 별개로, 수진님 블로그 대로 따라해서 api가 로컬서버에서 잘 작동합니다. 그 이후에 데이터가 보이지 않고 model.py랑 mysql를 연동시키는 부분에서 궁금한게 있습니다. 블로그에서는 settings.py에 가서 pymysql을 이용해서 mysql를 연동하라고 되어 있습니다. 찾아보닌깐 수진님의 이전 튜토리얼에서 settings.py에서
    Database설정을 하나 더 추가 하셧더라구요.(기존의 sqlite3 + mysql) 저는 수진님의 DRF부분부터 봐서 기존의 프로젝트의 db설정을 안햇습니다. 이러면 일단 api서버를 중단하고 원래 프로젝트의 settings.py에서 수진님이 하신것처럼 database를 추가하고 api로 돌아와서 api의 settings.py에서도 추가하고 다시 설정하면 잘 작동 할까요?
  • 프로필사진 오키여 이수진의 블로그 2020.11.05 21:43 신고 네 맞습니다. Database 설정을 추가하셔야 Django 상에서 mysql을 인식할 수 있고 연동이 가능합니다.

    DB 추가 -> migration -> 실행
    을 하시면 큰 문제 없으실겁니다!
  • 프로필사진 장고장고 2021.04.08 17:06 git에 올려주신 코드를 보면서 하고있는데 todoSubject_use_restfulAPI를 실행 시켜보면
    메인은 잘 나옵니다.
    근데 list메뉴를 누르면 JSONDecodeError at /board/ 에러가 납니다

    에러 메세지를 잘 보니 get_date쪽에서 에러가 발생하는 것 같은데 이걸 실행할 떄는 restfulapi도 실행 되어야되나요?

    로컬에서 하다보니 둘다 127.0.0.1:8000 으로 실행되거든요
  • 프로필사진 오키여 이수진의 블로그 2021.04.08 19:51 신고 안녕하세요.
    네 말씀하신대로 api서버도 실행이 되어야 합니다.

    제 github readme.md 보시면 설명이 나와 있지만, 서로 포트가 다르게 실행이 되니 참고해주세요.
댓글쓰기 폼