API_Server IN Django +3

LEE EUI JOO·2023년 2월 3일
0

Web Programming

목록 보기
5/17


API

  • Application Programming Interface 의 약자로 프로그램과 프로그램을 연결시켜주는 매개체

  • 프로그램과 프로그램 사이에서 동작해서 사용하는 것으로 데이터가 되기도 하고 프로그램이 되기도 한다

  • 프로그램 과 프로그램이 달라서 API가 필요

    • mysqlclient : python 과 mysql이 통신을 하기 위한 API를 제공하는 패키지
  • 보안 때문에 구현

    • 외부에서 내부의 데이터를 필요로 ㅎ나느 경우 내부의 데이터 저장소에 직접 접근하도록 하는 것은 위험하다

    • 외부에서는 API Server 에게 요청을 하고 API Server는 그 요청을 받아서 내부의 저장소에 접근해서 필요한 데이터를 가져와 외부에 전달하는 형태로 구현

  • CSR (Client Side Rendering) 때문에 구현

    • 클라이언트가 서버에게 데이터를 전송받아서 직접 화면을 구성하는 것을 CSR 이라고 한다

    • 스마트폰의 경우는 무선 통신을 이용하는데 무선 통신은 언제든지 연결이 해제될 수 있다

    • 만일 SSR(Server Side Rendering)을 이용하는 경우 서버와 네트워크가 끊어지면 스마트폰은 아무 일도 할 수가 없다

    • 스마트폰이 서버에서 데이터를 받은 후 로컬에 저장한 후 출력을 하는 구조를 사용하면 네트워크가 끊어지더라도 로컬의 데이터를 이용해서 컨텐츠를 구현할 수 있음

    • 서버가 요청을 받아서 처리한 후 뷰를 만들어서 클라이언트가 전달한다면 동일한 요청임에도 불구하고 클라이언트의 크기가 달라지거나 종류가 달라지면 요청 URL이 변경이 되어야 한다

    • 서버는 클라이언트의 요청을 받아서 처리를 수행한 후 결과를 클라이언트에게 전송을 하고 클라이언트가 데이터를 해석해서 출력하는 구조로 만들면 동일한 URL로 여러 디바이스의 요청을 처리할 수 있다

  • Data Format

    • txt : csv(구분자가 있는 문자열) 형식의 문자열로 데이터를 전송하는 경우는 데이터가 절대로 변하지 않는 경우

    • xml(Extensible Markup Language) : 태그 형태로 데이터를 표현, HTML 보다 구조적이고 브라우저가 해석 하지 않음, 초창기에 자주 변경되는 데이터를 전송할 때 많이 사용

    • Json(Java script Object Notation) : 자바스크립트(파이썬)의 데이터 표현법의 문자열로 표현하는 방식, xml 보다 가볍고 자바스크립트 파싱 하는 것이 수월하기 때문에 현재 가장 많이 사용됨

      • {"속성": 데이터, "속성": 데이터..} : 하나의 객체 - dict (속성으로 구분)

      • [데이터 나열] : 배열 - list (인덱스로 구분)

    • Excel, pdf 는 뷰를 만들어 주는 것이지 데이터 포맷은 아님

  • Django 에서는 REST API 를 위한 프레임워크를 제공 : djangorestframework


REST API Server 를 위한 애플리케이션 생성 및 기본 설정

애플리케이션 저장할 디렉토리 생성


DB 생성


필요한 패키지 설치

  • Django
  • djangorestframework
  • mysql client
pip install django
pip install djangorestframework
pip install mysql-client
pip install pymysql
  • pymysql 설정 - settings.py
<위에 패키지 import>

import pymysql

<db 부분>
# Database
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases
pymysql.install_as_MySQLdb()
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}


프로젝트 생성

django-admin startproject apiserver 


애플리케이션 생성

cd apiserver 
python manage.py startapp example


setting.py REST_API 서버를 만들기 위해 수정 - APPS, DB, TimeZone

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'example',
]


pymysql.install_as_MySQLdb()
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'restapidb',
        'USER': 'euijoo',
        'PASSWORD': 'euijoo',
        'HOST': 'localhost',
        'PORT' : '3306'

    }
}

# Internationalization
# https://docs.djangoproject.com/en/4.1/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Seoul'

USE_I18N = True

USE_TZ = True

DB 접속 확인

$ python manage.py inspectdb
 
# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:hon3-config     python3.10-config  python3.9-config                                                      
#   * Rearrange models' order
#   * Make sure each model has one field with primary_key=True
#   * Make sure each ForeignKey and OneToOneField has `on_delete` set to the desired behavior
#   * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
from django.db import models

example 로 시작하는 요청은 example 디렉토리의 urls.py 가 처리하도록 설정

  • 프로젝트의 urls.py 파일을 수정
"""
from django.contrib import admin
from django.urls import path
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('example/', include('example.urls'))
]

example 디렉토리에 있는 urls.py 을 생성하고 작성 - 핵심은 urls.py를 쪼갰다는 것

  • example/hello 라는 요청이 오면 현재 디렉토리의 views 파일에 있는 helloAPI 함수가 처리하도록 작성
from django.urls import path, include
from .views import helloAPI

urlpatterns = [
    # example 에 오면 helloAPI를 불러라
    path('hello',helloAPI),

]

example.hello 요청이 왔을 때 처리할 함수를 생성 - views.py 설정

from rest_framework.response import Response
from rest_framework.decorators import api_view


# @으로 시작하는 것은 decorator 라고 하는데
# 자주 사용하거나 만들기가 복잡한 코드가 있을 때
# 이 코드를 직접 작성하는 대신에 decorator 가 그 코드를 대신 작성!!

@api_view(['GET'])

def helloAPI(request):
    return Response('전송될 데이터')

# Create your views here.

Django Server 접속

$ python manage.py runserver

크롬 접속 창에 http://127.0.0.1:8000/example/hello 입력


🔥 render 는 화면을 만들어내는 것이고 response는 데이터를 만들어 내는 것 🔥


Response

  • 응답 결과를 만들어내는 클래스

    • 인스턴스를 생성할 때 첫번째 매개변수는 클라이언트에게 전송할 데이터이고 status는 상태

    • 상태

      • 100 번대 : 클라이언트가 서버로 보낸 요청이 문제가 없어서 다음 요청을 전송할 수 있다 라는 것을 의미

      • 200 번대 : 정상처리

        • 201 : 새로운 리소스 생성 - 삽입
        • 202 : 요청이 접수되었지만 아직 완료되지 않음
      • 300 번대 : 리다이렉션 중 - 요청은 처리하고 다른 처리를 수행 중

      • 400 번대 : 클라이언트 오류

        • 401 : 권한이 없음
        • 402 : 권한 이외의 문제로 리소스에 대한 액세스가 금지
        • 404 : 지정한 리소스를 찾을 수 없음 - 안만들었거나, name이 틀린 것
      • 500 번대 : 서버 오류 - 서버 프로그램이 잘못되었거나 처리 과정에 문제가 발생 <-> 개발자가 마주한다면 아마 알고리즘의 오류일 가능성이 높다


Serializer (직렬화)

  • 데이터를 다른 곳으로 전송할 수 있도록 변환하는 것

  • django 에서의 직렬화는 Model 데이터를 JSON으로 변환하는 것을 직렬화라고 한다

  • ' 데이터를 문자열로 바꿔준다 ' 라고 쉽게 생각할 것

  • 역직렬화 : 클라이언트가 전송한 JSON 문자열을 모델의 데이터로 변환하는 것

  • RESTAPI를 쓰게 되면 직렬화 작업이 필요하다

  • 작업을 수행할 때 어떤 속성을 직렬화에 포함시키고 어떤 속성을 제외할 지를 결정해야 한다

profile
무럭무럭 자라볼까

0개의 댓글