Django RESTful Framework

MVTλž€?

Model: 데이터 ꡬ쑰화

View: 데이터가 ν˜λŸ¬λ‹€λ‹ˆλŠ” κ³³

Template: 데이터λ₯Ό ν‘œμ‹œν•˜λŠ” κ³³

API λž€?

  • Application Programming Interface

    • 개발자용 접점

      • κ°œλ°œμžλŠ” Data만 ν•„μš”ν•¨!

Request

: μš”μ²­μ€ URL둜 보낸닀!

Data의 ν‘œκΈ°λ²•

: 약속

  • JSON

    • JavaScript Object Notation

    • Javascript 객체식 ν‘œκΈ°λ²•

  • XML

    • eXtended Markup Language (W3C, 1996)

Why not HTML?

: key값이 반영이 μ•ˆ 됨!

  • κ·Έλž˜μ„œ λ“±μž₯ν•œ 것이 tagλ₯Ό λ‚΄λ§˜λŒ€λ‘œ μ •μ˜ν•  수 μžˆλŠ” XML

Why JSON

  • XML이 λ‹«λŠ” tag λ•Œλ¬Έμ— 길이가 κΈΈλ‹€

    • 돈

μš°λ¦¬κ°€ ν•  일

: Django μ—μ„œ JSON ν˜•μ‹μ— λ§žμΆ°μ„œ Data만 μ œκ³΅ν•œλ‹€!

JSON ... 그리고 λ‚˜μ„œλŠ”?

image-20200511121142258

Javscript & framewokrλ₯Ό λΆ„λ¦¬ν•˜λŠ” 이유

  1. 쒋은 μœ μ € κ²½ν—˜μ„ μœ„ν•΄μ„œ

    • UX μ•ˆ μ’‹μœΌλ©΄ -> User X -> 돈 X

    • data -> 인간이 뭘 μ’‹μ•„ν• κΉŒ?

    • λͺ¨λ°”일 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ (μ›Ή)

    • churn (μ΄νƒˆμœ¨)

    • JS ν•„μˆ˜ (Adobe Flash)

  2. λΆ„λ¦¬λ˜μ–΄ μžˆλŠ” 것이 νŽΈν•΄μ„œ

Django λ‹€μ‹œ κΉ”κΈ°

pip uninstall django

pip install django==2.1.15

Faker μ‚¬μš©ν•˜κΈ°

faker μ„€μΉ˜

pip install faker

Dummy data λ§Œλ“€κΈ°

In [1]: from faker import Faker                                                                                     

In [2]: f = Faker()                                                                                                 

In [3]: f.text()                                                                                                    
Out[3]: 'Soldier live various argue many expect important once. Next possible whom I.\nSome national left wall score few else always. Action less culture spring any night.'

In [4]: f.name()                                                                                                    
Out[4]: 'Jenna Davis'

In [5]: f.paragraph()                                                                                               
Out[5]: 'Improve knowledge hot matter himself. Growth water act bill to can discuss there. Follow out person vote action someone.'

In [6]: f.paragraph(4)                                                                                              
Out[6]: 'Early program four bill. Comput

RESTful API

https://meetup.toast.com/posts/92 μ°Έκ³ ν•˜κΈ°

: url을 κΉ”λ”ν•˜κ²Œ μ •λ¦¬ν•˜λŠ” 방식 (κ³΅ν†΅μ˜ rule / 약속)

RESTful

  1. HTTP verb (GET, POST)

  2. λͺ…사 (λ³΅μˆ˜ν˜•)둜 ꡬ정

κ·œμΉ™λ“€

  • 동사 URL에 μ§‘μ–΄ λ„£μ§€λ§ˆ! -> HTTP method ν™œμš©ν•΄

    • C (POST)

      • (POST) / articles /

    • R (GET)

      • index (λͺ¨λ“  정보) - (GET) / articles /

      • detail (ν•˜λ‚˜μ˜ 정보) - (GET) / articles / <id>

    • U (PUT/PATCH)

      • (PUT) / articles / <id>

    • D (DELETE)

      • (DELETE) / articles / <id>

  • λͺ©μ μ–΄λ§Œ URL에 μ§‘μ–΄ λ„£μ–΄ -> λ³΅μˆ˜ν˜•μœΌλ‘œ

    • Data

API κ΄€λ ¨ URL

  1. subdomain

    • ex)

      • lab.ssafy.com

      • api.gitbub.com

  2. 뢄리 URL /api/

    • ssafy.com/api/lectures/

    • github.com/api/repos/

  3. versionning

    • ssafy.com/api/v1/lectures/

    • POST /api/articles/1/like/

    • POST /api/articles/1/comments/like/

Django REST Framework (DRF)

djangorestframework μ„€μΉ˜

pip install djangorestframework

μ„€μΉ˜λ˜μ–΄ μžˆλŠ”μ§€ 확인

$ pip show djangorestframework
Name: djangorestframework
Version: 3.11.0
Summary: Web APIs for Django, made easy.
Home-page: https://www.django-rest-framework.org/
Author: Tom Christie
Author-email: tom@tomchristie.com
License: BSD
Location: /home/chloe/.local/lib/python3.6/site-packages
Requires: django
Required-by: drf-serializer-cache

Serialize (직렬화)

포맷의 λ³€ν™˜ (데이터λ₯Ό 전솑/이동)

dict -> JSON (stringify, serialize)

JSON -> dict (parse, deserialize)

직렬화

: Object(μ–Έμ–΄, database) -> String (JSON)

CREATE

image-20200511162710246

raise_exception으둜 Error 예쁘게 좜λ ₯ν•˜κΈ°

ex)

@api_view(['POST'])
def article_create(request):
    # 글을 생성
    serializer = ArticleSerializer(data=request.data)
    if serializer.is_valid(raise_exception=True):
        serializer.save()
    return Response(serializer.data)

ν•˜λ‚˜λ§Œ 보냄

image-20200511162920160

μ—λŸ¬λ©”μ‹œμ§€

image-20200511162959467

yasg

  • API κ΄€λ ¨ λ¬Έμ„œλ₯Ό μžλ™μœΌλ‘œ 생성

DRF yasg μ„€μΉ˜ν•˜κΈ°

https://drf-yasg.readthedocs.io/en/stable/readme.html

pip install drf-yasg

Dummy data JSON 으둜 뢈러였기

fixtures 폴더에 dummy.json λ„£κΈ°

β”œβ”€β”€ api
β”‚   β”œβ”€β”€ __init__.py
β”‚   β”œβ”€β”€ settings.py
β”‚   β”œβ”€β”€ urls.py
β”‚   └── wsgi.py
β”œβ”€β”€ db.sqlite3
β”œβ”€β”€ manage.py
└── musics
    β”œβ”€β”€ admin.py
    β”œβ”€β”€ apps.py
    β”œβ”€β”€ fixtures
    β”‚   └── dummy.json
    β”œβ”€β”€ __init__.py
    β”œβ”€β”€ migrations
    β”œβ”€β”€ models.py
    β”œβ”€β”€ serializers.py
    β”œβ”€β”€ tests.py
    β”œβ”€β”€ urls.py
    └── views.py

7 directories, 29 files

loaddata 둜 dummy.json 을 DB에 λ„£κΈ°

$ python manage.py loaddata dummy.json
Installed 14 object(s) from 1 fixture(s)

dumpdata 둜 DB에 μžˆλŠ” data dumping ν•˜κΈ°

$ python manage.py dumpdata musics
[{"model": "musics.artist", "pk": 1, "fields": {"name": "Coldplay"}}, {"model": "musics.artist", "pk": 2, "fields": {"name": "Maroon5"}}, {"model": "musics.music", "pk": 1, "fields": {"artist": 2, "title": "Girls Like You"}}, {"model": "musics.music", "pk": 2, "fields": {"artist": 2, "title": "Sunday Morning"}}, {"model": "musics.music", "pk": 3, "fields": {"artist": 1, "title": "viva la vida"}}, {"model": "musics.music", "pk": 4, "fields": {"artist": 1, "title": "paradise"}}, {"model": "musics.comment", "pk": 1, "fields": {"music": 1, "content": "\uac78\uc2a4 \ub77c\uc78c \uc720!!!"}}, {"model": "musics.comment", "pk": 2, "fields": {"music": 1, "content": "\ub9c8\ub8ec \ud30c\uc774\ube0c \uc9f1\uc9f1!"}}, {"model": "musics.comment", "pk": 3, "fields": {"music": 2, "content": "\uc77c\uc694\uc77c \ubaa8\ub2dd~~~"}}, {"model": "musics.comment", "pk": 4, "fields": {"music": 2, "content": "\ud558\uc9c0\ub9cc \ub0b4\uc77c\uc740 \uc6d4\uc694\uc77c"}}, {"model": "musics.comment", "pk": 5, "fields": {"music": 3, "content": "10\ub144\uc774 \uc9c0\ub098\ub3c4 \uc88b\uc544"}}, {"model": "musics.comment", "pk": 6, "fields": {"music": 3, "content": "\ub9c8\uce58 \ub0b4\uac00 \uc655\uc774 \ub41c \uac83 \uac19\uc544!"}}, {"model": "musics.comment", "pk": 7, "fields": {"music": 4, "content": "\ud30c\ub77c\ub2e4\uc774\uc2a4 \ud30c\ub77c\ud30c\ub77c\ud30c\ub77c\ub2e4\uc774\uc2a4~"}}, {"model": "musics.comment", "pk": 8, "fields": {"music": 4, "content": "\uc228\uaca8\uc9c4 \uba85\uace1!!!"}}]

dumpdata둜 dumping ν•œ dataλ₯Ό JSON file둜 λ§Œλ“€κΈ°

μ΄λ ‡κ²Œ ν•˜λ©΄ λ‹€λ‹₯λ‹€λ‹₯ λΆ™μ–΄μžˆμŒ

python manage.py dumpdata musics > dump.json

indenting μ€˜μ„œ 예쁘게 λ§Œλ“€κΈ°

--indent 2 -> indenting을 2 쀘라

python manage.py dumpdata musics --indent 2 > dump2.json

result

[
{
  "model": "musics.artist",
  "pk": 1,
  "fields": {
    "name": "Coldplay"
  }
},
{
  "model": "musics.artist",
  "pk": 2,
  "fields": {
    "name": "Maroon5"
  }
},
{
  "model": "musics.music",
  "pk": 1,
  "fields": {
    "artist": 2,
    "title": "Girls Like You"
  }
},
{
  "model": "musics.music",
  "pk": 2,
  "fields": {
    "artist": 2,
    "title": "Sunday Morning"
  }
},
{
  "model": "musics.music",
  "pk": 3,
  "fields": {
    "artist": 1,
    "title": "viva la vida"
  }
},
{
  "model": "musics.music",
  "pk": 4,
  "fields": {
    "artist": 1,
    "title": "paradise"
  }
},
{
  "model": "musics.comment",
  "pk": 1,
  "fields": {
    "music": 1,
    "content": "\uac78\uc2a4 \ub77c\uc78c \uc720!!!"
  }
},
{
  "model": "musics.comment",
  "pk": 2,
  "fields": {
    "music": 1,
    "content": "\ub9c8\ub8ec \ud30c\uc774\ube0c \uc9f1\uc9f1!"
  }
},
{
  "model": "musics.comment",
  "pk": 3,
  "fields": {
    "music": 2,
    "content": "\uc77c\uc694\uc77c \ubaa8\ub2dd~~~"
  }
},
{
  "model": "musics.comment",
  "pk": 4,
  "fields": {
    "music": 2,
    "content": "\ud558\uc9c0\ub9cc \ub0b4\uc77c\uc740 \uc6d4\uc694\uc77c"
  }
},
{
  "model": "musics.comment",
  "pk": 5,
  "fields": {
    "music": 3,
    "content": "10\ub144\uc774 \uc9c0\ub098\ub3c4 \uc88b\uc544"
  }
},
{
  "model": "musics.comment",
  "pk": 6,
  "fields": {
    "music": 3,
    "content": "\ub9c8\uce58 \ub0b4\uac00 \uc655\uc774 \ub41c \uac83 \uac19\uc544!"
  }
},
{
  "model": "musics.comment",
  "pk": 7,
  "fields": {
    "music": 4,
    "content": "\ud30c\ub77c\ub2e4\uc774\uc2a4 \ud30c\ub77c\ud30c\ub77c\ud30c\ub77c\ub2e4\uc774\uc2a4~"
  }
},
{
  "model": "musics.comment",
  "pk": 8,
  "fields": {
    "music": 4,
    "content": "\uc228\uaca8\uc9c4 \uba85\uace1!!!"
  }
}
]

Last updated

Was this helpful?