안녕하세요🙏 개발자 재민콩입니다.
오늘은 Python Django REST framework를 활용한 API 개발을 진행해 보겠습니다.
데이터베이스는 Postgresql을 사용했습니다.
먼저 해야 할 일들을 정리해 보겠습니다.
- conda python 가상환경 설정
- database 생성 및 유저 생성, 권한 설정
- setting.py 수정
- model 작성
- rest_framework generics, mixin을 활용한 api view 작성
- api url 작성
- postgresql superuser 생성
- python miagrate & runserver
1. conda python 가상환경 설정
// conda 가상환경 생성
$ conda create -n api python=3.8
// conda 활성화
$ conda activate api
// Django 설치
$ pip install Django==3.2.5
// 다른 도메인에서 api에 접근하기(CORS) 위한 application
// Django REST framework 설치
$ pip install django-cors-headers
$ pip install djangorestframework
// API Key 설치
$ pip install djangorestframework-api-key
// Python Postgresql 데이터베이스 어댑터
$ pip install psycopg2
2. database 생성 및 유저 생성, 권한 설정
// database 생성
$ createdb board
// postgresql database 접속
$ psql board
// user 생성
board=# create user board with encrypted password 'board';
// user 권한 설정
board=# grant all privileges on database board to board;
3. setting.py 수정
INSTALLED_APPS 수정
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'rest_framework_api_key',
'corsheaders',
'board',
]
MIDDLEWARE 수정
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'corsheaders.middleware.CorsMiddleware',
]
DB 정보 입력
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'board',
'USER': 'board',
'PASSWORD': 'board',
'HOST': 'localhost',
'PORT': '5432',
}
}
REST_FRAMEWORK 추가
REST_FRAMEWORK = {
"DEFAULT_PERMISSION_CLASSES": [
"rest_framework_api_key.permissions.HasAPIKey",
]
}
REST_FRAMEWORK 추가
API_KEY_CUSTOM_HEADER = "HTTP_API_KEY"
4. model 작성
model.py
from django.db import models
from django.utils.translation import gettext_lazy as _
class Board(models.Model):
title = models.CharField(
_("제목"),
max_length=1000,
default=''
)
desc = models.CharField(
_("설명"),
max_length=3000,
default=''
)
writer = models.CharField(
_("작성자"),
max_length=100,
null=True
)
views = models.IntegerField(
_("조회수"),
default=0
)
updated_at = models.DateTimeField(
_("수정일자"),
null=True,
blank=True
)
deleted_at = models.DateTimeField(
_("삭제일자"),
null=True,
blank=True
)
5. rest_framework generics, mixin을 활용한 api view 작성
serializers.py
from rest_framework import serializers
from .models import Board
class BoardSerializer(serializers.ModelSerializer) :
class Meta :
model = Board # Board 모델 사용
fields = '__all__' # 모든 필드 포함
view.py
from django.shortcuts import render
from .models import Board
from rest_framework import generics
from rest_framework import mixins
from .serializers import BoardSerializer
# API Board views
class BoardList(generics.GenericAPIView, mixins.ListModelMixin):
serializer_class = BoardSerializer
def get_queryset(self):
return Board.objects.filter(deleted_at__isnull=True)
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
class BoardDetail(generics.GenericAPIView, mixins.RetrieveModelMixin):
serializer_class = BoardSerializer
def get_queryset(self):
return Board.objects
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def index(request):
return render(request, 'index.html')
6. api url 작성
url.py
from django.contrib import admin
from django.conf.urls import url
from django.conf import settings
from django.conf.urls.static import static
from django.urls import path
from board import views
urlpatterns = [
url(r'^$', views.index),
path('admin/', admin.site.urls),
path('api/board/', views.BoardList.as_view()),
path('api/board/<int:pk>/', views.BoardDetail.as_view()),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
7. postgresql superuser 생성
$ python manage.py createsuperuser
Username (leave blank to use '[사용자명]'): admin
Email address: admin@google.com
Password: 🗝
Password (again): 🗝
8. python miagrate & runserver
$ python manage.py migrate
$ python manage.py runserver
shell에 아래와 같은 화면이 나오면 성공입니다👍
127.0.0.1:8000/admin으로 들어가서 아까 생성한 superuser 계정으로 로그인하면 아래와 같은 화면이 나옵니다.
간단하게 data를 넣어주고 아까 생성한 url로 api 데이터를 받아보겠습니다.
admin 목록에 보여줄 데이터 들은 admin.py에서 설정할 수 있습니다.
from django.contrib import admin
from .models import Board
# Register your models here.
@admin.register(Board)
class BannerAdmin(admin.ModelAdmin):
list_display = [
'id',
'title',
'desc',
'writer',
'views',
'updated_at',
'deleted_at',
]
127.0.0.1:8000/api/board
request header에 api-key를 주지 않아 에러가 뜹니다.
Chrome App을 활용하여 header에 api를 발급받아 넣어주겠습니다.
ModHeader 다운로드
API key 발급
상단에 발급받은 API key를 복사합니다
1dyprowx.ZMjWeqVvV9cqCfrJLdBagBQcsDOwfcrZ
API키는 다시 확인할 수 없기때문에 잘 보관해 두어야 합니다.
ModHeader API key 입력
Authorization: APi-key [발급받은 키]
127.0.0.1:8000/api/board/5
여기까지 완료하시면 간단하게 API를 구축할 수 있습니다🙌
Reference
'Backend > Django' 카테고리의 다른 글
[Django] Django timezone 설정 (0) | 2022.11.29 |
---|---|
[Django] User 모델 확장 (0) | 2022.11.17 |