--RESTful API
REpresentational State Transfer
요청 ->
서버 리소스의 상태 전달
Client ---------request--------> Server
<--------response-------
WAS(web application server)
django = application server의 역할을 함
tomcat, webLogic,
프로토콜, 인터페이스 : 서로간의 데이터 통신규약을 정해서 맞춰야함.
REST 방식 : 서버가 갖고있는 리소스 상태를 전달해주기 위한 방법 : REST API (html을 전달하는 것이 아님)
데이터 포맷을 상관하지 않고 전달할 수 있으므로 다양한 어플리케이션에서 활용가능함
Android : java, kotlin
ios : objective-c, swift
Resource(server가 가지고 있는 data)
HTTP 프로토콜 + method type(post, get, put, delete)
URI (server + resource) : 좀 더 포괄적인 의미
URL (http프로토콜 사용하는 것)
0단계 : Expose Soap Web Services in Rest Style
1단계 : Expose Resources with Proper URI
Note : Improper Use of Http Methods
2단계 : LEVEL 1 + Http Methods(GET, POST, PUT, DELETE)
3단계 : LEVEL 2 + HATEOAS, DATA + Next Possible Actions
-
Hypermedia as the Engine of Application State
-
It basically means that your application state should be Hypermedia driven.
-
Hypermedia? - Basically hyperlinks to other resources.
-
Which also means that, once a client access a resource, it can use the hypermedia to navigate your resources.
-- Best Pratices in Restful Design
-
Consumer First
-
Make Best Use of Http
-
No Secure Info in URI
-
Use Plurals
-
Prefer /users to /user
-
Prefer /users/1 to/user/1
-
Use Nouns for Resources
-
For Exceptions
-
/search, PUT/ gists/{id}/star, DELETE/gists/{id}/star
-
-
Define A Consistent Approach
-
Response Status
-
200 - SUCCESS(get, delete 성공)
-
201 - CREATED(post, put 성공)
-
400 - BAD REQUEST
-
401 - UNAUTHORIZED
-
403 - NOT CERTIFICATED
-
404 - RESOURCE NOT FOUND
-
405 - NOT FOUND
-
500 - SERVER ERROR(버그, 시스템)
--django REST framework
-
$pip install djangorestframework
Home - Django REST framework
www.django-rest-framework.org
**django REST framework
-
Serializers
-
기존) Django ORM의 QuerySet -> Template -> HTML로 렌더링
-
REST) QuerySet -> JSON
-
Client에게 전달하기 위한 Format
-
serializers.py
Meta : Model을 정의할 때 부가적인 설정을 할 때의 클래스 명
2. Views
-
ViewSet
-
list(), create()와 같은 액션 제공
-
urlconf에 등록하기 보다는, router 클래스로 등록하면 자동으로 urlconf가 결정
-
직접 ViewSet을 작성하는 것 대신, 기본 클래스 사용가능
-
rest_views.py
3. URLs
-
mysite/urls.py
4. Pagination
-
반환하는 데이터의 개수
-
mysite/settings.py
5. Testing
-
$python manage.py runserver
-
Postman 사용
#blog/serializers.py
from django.contrib.auth.models import User, Group
from rest_framework import serializers
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ['url', 'username', 'email']
# class GroupSerializer(serializers.HyperlinkedModelSerializer):
# class Meta:
# model = Group
# fields = ['url', 'name']
#blog/rest_views.py
from django.contrib.auth.models import User
from rest_framework import viewsets
from rest_framework import permissions
from blog.serializers import UserSerializer
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
permission_classes = [permissions.IsAuthenticated]
#mysite/urls.py
from rest_framework import routers
from blog import rest_views
router = routers.DefaultRouter()
router.register(r'users', rest_views.UserViewSet)
urlpatterns = [
path('admin/', admin.site.urls),
path('', HomeView.as_view(), name='home'),
path('bookmark/', include('bookmark.urls', namespace='bookmark')),
path('blog/', include('blog.urls', namespace='blog')),
path('api/', include(router.urls)),
path('api-auth', include('rest_framework.urls', namespace='rest_framework'))
]
#mysite/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'bookmark.apps.BookmarkConfig',
'blog.apps.BlogConfig',
'rest_framework',
]
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE' : 10
}

$python manage.py startapp api
#mysite/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('', HomeView.as_view(), name='home'),
path('bookmark/', include('bookmark.urls', namespace='bookmark')),
path('blog/', include('blog.urls', namespace='blog')),
# path('api/', include(router.urls)),
# path('api-auth', include('rest_framework.urls', namespace='rest_framework'))
path('api/', include('api.urls', namespace='api'))
]
#api/serializers.py
from rest_framework import serializers
from blog.models import Post
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ['id', 'title', 'slug', 'description', 'content', 'create_date', 'modify_date']
#api/views.py
from rest_framework import viewsets
from rest_framework import permissions
from api.serializers import PostSerializer
from blog.models import Post
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
permission_classes = [permissions.IsAuthenticated]
#api/urls.py
from django.urls import path, include
from api.views import PostViewSet
app_name = 'api'
post_list = PostViewSet.as_view({ 'get':'list' })
post_detail = PostViewSet.as_view({ 'get':'retrieve' })
urlpatterns = [
path('auth/', include('rest_framework.urls', namespace='rest_framework')),
path('posts/', post_list, name='post_list'),
path('posts/<int:pk>', post_detail, name='post_detail'),
]
#mysite/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'bookmark.apps.BookmarkConfig',
'blog.apps.BlogConfig',
'rest_framework',
'api',
]
**웹브라우저 사용

**Postman 사용

'CLOUD > Django' 카테고리의 다른 글
1/22 Django - 복습(Templates, Static , Search with VS Code) (0) | 2021.01.22 |
---|---|
1/21 Django - 복습 2차시(with VS Code) (0) | 2021.01.21 |
1/20 - Django 복습(with VS Code) (0) | 2021.01.20 |
1/15 Django 4차시 - blog app 만들기(Maria DB, 페이징처리, django REST frame) (0) | 2021.01.15 |
1/14 Django 3차시 - blog app만들기(CRUD + 로그인/로그아웃 + reply) (0) | 2021.01.14 |