웹에서 주어진 리소스의 주소
https://www.example.com:80/path/to/myfile.html?key=value1&key2=values2#SomewhereInTheDocumnet
Scheme , Domain Name, Port, Path to the file, Parameters, Anchor
# python-request-sample.py
import requests
from pprint import pprintresponse = requests.get('http://127.0.0.1:8000/api/v1/articles/')
# json을 python 타입으로 변환
result = response.json()
print(type(result))
# pprint(result)
# pprint(result[0])
# pprint(result[0].get('title'))
```


| 빈칸 | GET | POST | PUT | DELETE |
|---|---|---|---|---|
| articles/ | 전체 글 조회 | 글 작성 | ||
| articles/1/ | 1번글 조회 | 1번 글 작성 | 1번 글 삭제 |
from rest_framework import serializers
from .models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ('id', 'title', 'content', )
urls.py
# articles/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('articles/', views.article_list),
]
views.py
# views.py
from rest_framework.response import Response
from rest_framework.decorators import api_view
from .serializers import ArticleSerializer
from .models import Article
# @api_view()
@api_view(['GET'])
def article_list(request):
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
똑같은 데이터를 HTML에 출력되도록 페이지와 함계 응답했던 과거의 view 함수, JSON 데이터로 serializtion 하여 페이지 없이 응답하는 현재의 view 함수
# Past
def index(reqeust):
articles = Article.objects.all()
context = {
'articles': articles,
}
return render(request, 'articles/index.html', context)
# Recent
@api_view(['GET'])
def article_list(request):
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
단일 게시글 데이터 조회하기
serializer.py
# articles/serializer.py
from rest_framework import serializers
from .models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = '__all__'
urls.py
# articles/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('articles/<int:article_pk>/', views.article_detail),
]
views.py
```python
# views.py
from .serializers import ArticleSerializer,ArticleListSerializer
# @api_view()
@api_view(['GET'])
def article_list(request):
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
```
게시글 데이터 생성하기
views.py
from rest_framework import status
@api_view(['GET', 'POST'])
def article_list(request):
if request.method == 'GET':
articles = Article.objects.all()
serializer = ArticleListSerializer(articles, many = True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = ArticleSerializer(data=request.data)
if serializer.is_vaild():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
게시글 데이터 삭제하기
views.py
from rest_framework import status
@api_view(['GET', 'DELETE'])
def article_detail(request, article_pk):
article = Article.objects.get(pk=article_pk)
if request.method == 'GET':
serializer = ArticleSerializer(article)
return Response(serializer.data)
elif request.method == 'DELETE':
article.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
게시글 데이터 수정하기
views.py
from rest_framework import status
@api_view(['GET', 'DELETE', 'PUT'])
def article_detail(request, article_pk):
article = Article.objects.get(pk=article_pk)
if request.method == 'GET':
serializer = ArticleSerializer(article)
return Response(serializer.data)
elif request.method == 'DELETE':
article.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
elif request.method == 'PUT':
serializer = ArticleSerializer(article, data=request.data, partial=True)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
raise_exception
유효성 검사를 통과하지 못할 경우 ValidationError 예외를 발생시킴
DRF에서 제공하는 기본 예외 처리기에 의해 자동으로 처리되며 기본적으로 HTTP 400 응답을 반환
from rest_framework import status
@api_view(['GET', 'DELETE', 'PUT'])
def article_detail(request, article_pk):
...
elif request.method == 'PUT':
serializer = ArticleSerializer(article, data=request.data, partial=True)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)
# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
ArticleSerializer(article, data=request.data, partial=True)