grape

Django로 RESTful API 서버 설계하기 (3) 본문

웹 프로그래밍/Django

Django로 RESTful API 서버 설계하기 (3)

grape-story 2021. 5. 20. 17:57

개발환경

window + Python 3.8 + PyCharm

 

 

목표

Django rest framework 튜토리얼 학습

간단한 주소록 구현 

 

 

1. API 서버 테스트 용 클라이언트 툴 설치

API 서버를 테스트 하기 위해서는 서버로 데이터를 전송하는 클라이언트 부분이 필요하다. 이런 클라이언트 부분의 전송 툴이 몇가지 있는데  여기서는 "insomnia"를 사용한다.  

먼저 "insomnia" 홈페이지에서 다운로드 받는다.  "insomnia" 툴을 사용하면 간단하게 API 호출 메세지를 만들어서 특정 서버에 호출할 수 가 있다. 즉, 테스트 툴 이라고 생각하면 된다. 

 

 

먼저 insomnia를 실행한 후 처음에 나오는 부분은 스킵 한다. 그후 ctrl + n 을 하면 새로운 Request를 만들 수 있다. 

 

이름 부분은 원하는 이름으로 지정하면 되고 옆에 GET 부분을 클릭하면 어떤 방식으로 요청을 보낼지 선택할 수 있는 설정 창이 나온다 일단은 GET 요청으로 생성 한다. 

 

새로운 Request를 만들고 나면 위와 같은 화면을 볼 수 있는데 요청을 보낼 URL을 적어서 Send를 누르면 해당 서버에 요청이 잘 가고 응답이 오는 것을 볼 수 있다. (현재는 로컬이기 때문에 로컬 IP주소를 입력)

 

 

2. REST framework 설치 및 실행

django REST framework 패키지 공식 문서(홈페이지)가 있다. 해당 사이트에 접속하면 어떻게 해야하는지 가이드가 나와있어서 그대로 진행해 주면 된다. 

pip install djangorestframework
pip install markdown       # Markdown support for the browsable API.
pip install django-filter  # Filtering support

공식 홈페이지에서 나와 있는 것 처럼 차례대로 설치를 진행 해준다. 

 

INSTALLED_APPS = [
    ...
    'rest_framework',
]
urlpatterns = [
    ...
    path('api-auth/', include('rest_framework.urls'))
]

설치를 하고 난 후 INSTALLED_APPS 에 'rest_framework' 를 추가하고 urlpatterns 에 api 경로를 추가 해주라는 설명이 나와 있다 그대로 진행해 준다. 

 

  • INSTALLED_APPS는 settings.py에 들어가 보면 있는데 settings.py는 맨 처음 프로젝트를 만들때 생성된 메인 app 안에 들어 있다. 
  • 참고로 django는 app단위로 관리하기 때문에 settings.py에는 설치된 app들이 명시되어 있다. 

INSTALLED_APPS에 'rest_framework'를 추가해 준다음 url을 추가해 줘야하는데 urls.py는 같은 메인 app 안에 들어 있다.

위 사진 처럼 URL도 추가 해 주면 된다. 해당 코드를 입력하면 include 부분에 빨간색 밑줄이 그어지게 되는데  import가 되어 있지 않기 때문이다. 따라서 include를 import 해주면 된다. !  

 

REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ]
}

그리고 나서 다시 settings.py에서 위 코드를 추가해 준다. 위 설정은 pagination의 크기를 지정할 수 도 있고, API의 접근 권한을 지정할 수도 있다. 즉, 설정에 따라 admin 사용자일 때만 접근이 가능하게 할 수 도 있다. 

 

  • 여기까지 설정하면 REST API를 만들 준비가 다 된 것이다 ! 
from django.urls import path, include
from django.contrib.auth.models import User
from rest_framework import routers, serializers, viewsets

# Serializers define the API representation.
class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ['url', 'username', 'email', 'is_staff']

# ViewSets define the view behavior.
class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

# Routers provide an easy way of automatically determining the URL conf.
router = routers.DefaultRouter()
router.register(r'users', UserViewSet)

# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

위 코드는 REST framework 패키지 공식 홈페이지에 나와있는 샘플 코드로 위 코드를 입력하게 되면 샘플 REST API 통신을 할 수 있게 된다. 

 

공식 홈페이지에 나와있는 샘플코드를 urls.py 넣고 실행 하면 샘플 REST API 통신을 할 수있다. 

  • 코드에서 노랑색 밑줄이 나오는 것은  PEP 8이라는 오류가 나온 것이다.
  • 보통 파이참으로 코딩을 할 때 많이 나오는 것인데 PEP 8 오류란 어떠한 단체에서 파이썬 코드를 어떻게 사용하자는 규칙을 정했다. (ex - 들어 들여쓰기는 띄어 쓰기 4번으로 하자.  =(등호)가 있으면 앞칸이란 뒤칸에 스페이스(공백)을 붙히자.. 등등) 이 규칙이 적힌 규약집이 PEP 8 이다. 
  • 즉, 노랑색 밑줄은 PEP 8 에서 정한 규칙을 지키지 않아서 나오는 것 ! 
  • 파이썬에서는 함수와 함수 (클래스와 클래스) 사이에 주석을 제외하고 엔터(공백)가 2줄이 있어야 한다 그렇게 하면 노랑색 밑줄이 사라지는 것을 확인할 수 있다.

PEP8

  • PEP8 : 파이썬 개선 제안서, 파이썬 코드를 어떻게 구상할 지 알려주는 스타일 가이드
  • PEP8 전체 가이드
  • 다른 사람과 원활하게 협업하려면 공통된 스타일 공유가 필요
  • 일관성 있는 스타일은 나중에 수정하기도 쉽다.

 

이제 서버를 구동시켜서 로컬주소인 (127.0.0.1:8000)으로 접속하면 위 사진처럼 browsable API 를 볼 수 있다. 

현재 설정되어 있는 Api 루트 중 users 루트가 존재 하고 현재 나와있는 "http://127.0.0.1:8000/users/"로 접속할 수 있다는 뜻이다. 따라서 해당 ip경로로 접속하면 다음과 같은 화면이 나온다. 

  • 직접 "http://127.0.0.1:8000/users/" 를 웹 브라우저에 타이핑 해서 들어가도 되고 해당 주소를 클릭해서 들어가도 된다. 

 

Api Root 안에 User List가 존재하고 GET 요청으로 /users/ 경로를 요청했다는 뜻이며 해당 경로 안에서 할 수 있는 것들은 GET, POST, HEAD, OPTIONS 들이 존재한다는 뜻이다. 현재 샘플 소스로 users경로에 접근을 한 것 

http://127.0.0.1:8000/users/ # /users/로 접속한 URL 경로

앞서 "REST, REST API, REST ful 이란?" 포스트에서 작성했듯이 RESTful API는 지정된 URL 형식이 있으며 명사로 와야하고 복수형으로 작성해야한다는 규칙이 그대로 적용되어 있는 것을 볼 수 있다.  

복수형으로 작성하는 이유는 "http://127.0.0.1:8000/users/1" 이런식으로 users들 중에서 1번째 있는 user를 검색할떄 보다 쉽고 직관적으로 URL을 작성하기 위한 것이며 여기서 users 는 user들의 전체를 의미 한다. 

만약 user들의 데이터가 여러개 저장 되어 있었다면 해당 화면에서 저장되어 있는 user들의 목록이 보였을 테지만 현재는 데이터가 없기 때문에 [] <= 아무것도 없이 빈칸이다. 

 

 browsable API의 화면을 보면 Login을 할 수 있는데 해당 화면에서 로그인을 하기 위해서는 django 서버에서 superuser(슈퍼유저)를 생성하면 된다. 

 

 

3. Superuser(슈퍼유저) 생성

슈퍼유저를 생성하는 방법은 간단하다. 터미널에서 "python manage.py createsuperuser" 명령어를 입력한 뒤 사용할 유저 ID 패스워드를 입력해 주면된다. 

  • 슈퍼 유저 생성 시 이메일 주소는 스킵 해도 된다. 
  • 패스워드 입력 시 화면에서 아무것도 안나오는 것을 볼 수 있는데 원래 아무것도 안나온다. 사용할 패스워드를 입력한 뒤 엔터를 누르고 패스워드 확인을 위해 똑같이 지정한 패스워드를 입력한 뒤 엔터를 누르면 성공적으로 슈퍼유저가 생성된다. 

 

 

4. browsable API에서 슈퍼유저로 로그인

새롭게 만든 슈퍼유저 계정으로 로그인을 하게 되면 위 화면 처럼 User List에 새로운 유저(슈퍼유저)가 추가 된 것을 볼 수 있으며 POST 요청으로 새롭게 user를 생성할 수 있는 것을 확인할 수 있다. 

  • RESTful API에서 POST 요청은 Create(생성) 이다. 
  • Staff status는 Staff인지 체크하는 부분이다 체크 시 "is_staff": true로 되며 체크를 안하면 false가 된다. 

 

user를 새롭게 생성하는 POST 요청을 보내게 되면 요청이 성공했다는 화면이 나오며 APi Root / User List 클릭 or "127.0.0.1:8000/users" IP주소로 접속하면 위 화면처럼 user들의 전체 데이터 화면을 볼 수 있다. 

 

 

RESTful API를 설계하게 되면 모든 자원에 고유한 ID가 부여되는데 해당 ID를 url 에서 입력하게 되면 해당 데이터(리소스)만 나오는 화면을 볼 수 있다. 

  • /users/1/: 슈퍼 유저 
  • /users/2/: 새롭게 생성한 test1 

 

5. 클라이언트 툴로 데이터 요청하기 

앞서 설치한 클라이언트 툴인 insomnia로 똑같이 GET 요청으로 해당 IP주소를 요청하게 되면 JSON 형태로 데이터가 오는 것을 볼 수 있다. 

 

 

  • 해당 글은 유튜브 mychew__ 님의 채널의 동영상을 보고 학습 및 정리한 글 입니다. 

 

참고

https://www.youtube.com/watch?v=lKDw_xqo-Ro 

https://www.django-rest-framework.org/

 

Home - Django REST framework

 

www.django-rest-framework.org

 

Comments