일하는/Cloud, Web

Django REST Framework : Tutorial (3)

김논리 2020. 9. 1. 09:47

https://ungodly-hour.tistory.com/20

 

Django REST Framework : Tutorial (2)

https://ungodly-hour.tistory.com/19 Django REST Framework : Tutorial (1) Django Django는 Python으로 작성된 오픈 소스 웹 애플리케이션 프레임워크로, 풀 스택을 지원한다. Python 기반의 웹 프레임워크 중..

ungodly-hour.tistory.com


 

Migrate

서버를 실행하기 전, DB를 migrate 한다. (최초 실행 혹은 애플리케이션의 Model이 변경될 경우, 해당 변경을 DB에 알려주기 위함)

 

(env) tutorial $ python manage.py migrate

 

Model이 변경된 경우에는 migrate을 수행하기 전, 아래와 같이 변경점에 대한 migration 파일을 생성해야 한다.

 

(env) tutorial $ python manage.py makemigrations

 

생성된 migration 파일은 애플리케이션 디렉토리(myapp) 하위 migrations 디렉토리에 저장된다.

 

Run Server

이제 다음과 같이 서버를 실행 보자.

 

(env) tutorial $ python manage.py runserver

 

우리가 사용한 Viewset은 기본적으로 Browsable API를 지원하므로, CURL 등 다양한 클라이언트로도 API 사용이 가능하지만, 웹 브라우저를 이용하여 API 사용도 가능하다. 웹 브라우저를 통해 API root(/)로 접속하여 다음과 같이 제공되는 API를 확인할 수 있다.

 

API root

 

 

Testing Our APIs

이제 구현한 API가 정상적으로 동작하는지, HTTPie client를 이용하여 확인해 보자. HTTPie의 자세한 사용법은 공식 홈페이지 🏠 https://httpie.org/ 를 통해 확인할 수 있다.

 

POST

developer 이름의 그룹과 Tom이라는 사용자를 추가해 보자.

 

$ http POST 127.0.0.1:8000/groups/ name=developer
HTTP/1.1 201 Created
Allow: GET, POST, HEAD, OPTIONS
Content-Length: 60
Content-Type: application/json
Date: Tue, 01 Sep 2020 00:57:10 GMT
Location: http://127.0.0.1:8000/groups/1/
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.6.9
Vary: Accept, Cookie
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
    "name": "developer",
    "url": "http://127.0.0.1:8000/groups/1/"
}

$ http POST 127.0.0.1:8000/users/ username=Tom email=tom@example.com
HTTP/1.1 201 Created
Allow: GET, POST, HEAD, OPTIONS
Content-Length: 95
Content-Type: application/json
Date: Tue, 01 Sep 2020 00:59:54 GMT
Location: http://127.0.0.1:8000/users/1/
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.6.9
Vary: Accept, Cookie
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
    "email": "tom@example.com",
    "groups": [],
    "url": "http://127.0.0.1:8000/users/1/",
    "username": "Tom"
}

 

GET

사용자와 그룹 리스트를 가져오자.

 

$ http GET 127.0.0.1:8000/groups/
HTTP/1.1 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Length: 62
Content-Type: application/json
Date: Tue, 01 Sep 2020 01:00:34 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.6.9
Vary: Accept, Cookie
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

[
    {
        "name": "developer",
        "url": "http://127.0.0.1:8000/groups/1/"
    }
]

$ http GET 127.0.0.1:8000/users/
HTTP/1.1 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Length: 97
Content-Type: application/json
Date: Tue, 01 Sep 2020 01:00:38 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.6.9
Vary: Accept, Cookie
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

[
    {
        "email": "tom@example.com",
        "groups": [],
        "url": "http://127.0.0.1:8000/users/1/",
        "username": "Tom"
    }
]

 

PUT

Tom의 사용자 정보를 수정하여 그룹 정보를 추가해 보자.

 

$ http PUT 127.0.0.1:8000/users/1/ username=Tom email=tom@example.com groups:='["http://127.0.0.1:8000/groups/1/"]'
HTTP/1.1 200 OK
Allow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS
Content-Length: 128
Content-Type: application/json
Date: Tue, 01 Sep 2020 01:03:07 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.6.9
Vary: Accept, Cookie
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
    "email": "tom@example.com",
    "groups": [
        "http://127.0.0.1:8000/groups/1/"
    ],
    "url": "http://127.0.0.1:8000/users/1/",
    "username": "Tom"
}

 

DELETE

Tom 사용자 정보를 삭제해 보자.

 

$ http DELETE 127.0.0.1:8000/users/1/
HTTP/1.1 204 No Content
Allow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS
Content-Length: 0
Date: Tue, 01 Sep 2020 01:06:18 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.6.9
Vary: Accept, Cookie
X-Content-Type-Options: nosniff
X-Frame-Options: DENY


$ http GET 127.0.0.1:8000/users/
HTTP/1.1 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Length: 2
Content-Type: application/json
Date: Tue, 01 Sep 2020 01:06:37 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.6.9
Vary: Accept, Cookie
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

[]