일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- css #생활코딩 #웹
- react #리액트 #동빈나
- java #자바 #나동빈
- 백준 #파이썬 #알고리즘 #코딩테스트
- 다익스트라
- css #웹 #생활코딩
- PYTHON
- 백준
- 코딩테스트
- java #자바 #동빈나
- 자바 #java
- 백트랙킹
- 프로그래머스
- 투포인터
- java #자바
- 재귀
- react #리액트 #동빈나 #나동빈 #유튜브강의
- 다이나믹프로그래밍
- dp
- 프로그래머스 #파이썬 #코딩테스트 #알고리즘
- 백준 #알고리즘 #파이썬 #코딩테스트
- DFS
- BFS
- 프로그래머스 #파이썬 #알고리즘 #코딩테스트
- Dijkstra
- 파이썬 #알고리즘 #코딩테스트 #프로그래머스
- java #자바 #생활코딩
- 알고리즘
- 파이썬 #백준 #알고리즘 #코딩테스트
- 파이썬
Archives
- Today
- Total
커리까지
[Django REST framework] 5: Relationships & Hyperlinked APIs 본문
728x90
SMALL
endpoint for the root of our API 만들기
- 이전에 만들었던 api는 endpoint가
snippet
,user
각각 2개였다. - 이걸 하나의 endpoint로 만들자.
restapi > appapi > views.py
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.reverse import reverse
@api_view(['GET'])
def api_root(request, format=None):
return Response({'users': reverse('user-list', request=request, format=format),
'snippets': reverse('snippet-list', request=request, format=format)})
reverse
는 정규화된 url을 반환한다.- 나중에
urls.py
에서 이름으로 식별한다.
endpoint for the highlighted snippets 만들기
restapi > appapi > views.py
get()
를 만들어서 해보자.
from rest_framework import renderers
class SnippetHighlight(generics.GenericAPIView):
queryset = Snippet.objects.all()
renderer_classes = [renderers.StaticHTMLRenderer]
def get(self, requets, *args, **kwargs):
snippet = self.get_object()
return Response(snippet.highlighted)
restapi > appapi > urls.py
urlpatterns = [
path('', api_root),
path('snippets/<int:pk>/highlight/', SnippetHighlight.as_view()),
]
실행해보기
path('', api_root)
는 view에서 현재 연결된 url이 없어서 오류가 난다.
http://127.0.0.1:8000/snippets/1/highlight/
- view에서
renderer_classes = [renderers.StaticHTMLRenderer]
를 설정했기에 우리가 알던 html이 아니라 이런 화면이 나온다.
Hyperlinking our API
- serializer에 적용된
ModelSerializer
를HyperlinkedModelSerializer
로 변경해여 한다.
restapi > appapi > serializers.py
class SnippetSerializer(serializers.HyperlinkedModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username')
highlight = serializers.HyperlinkedIdentityField(view_name='snippet-highlight', format='html')
class Meta:
model = Snippet
fields = ['url', 'id', 'highlight', 'owner', 'title', 'code', 'linenos', 'language', 'style']
class UserSerializer(serializers.HyperlinkedModelSerializer):
snippets = serializers.HyperlinkedRelatedField(many=True, view_name='snippet-detail', read_only=True)
class Meta:
model = User
fields = ['url', 'id', 'username', 'snippets']
url에 이름 부여하기
- 현재 serializer이나 view에 url과 연결되는 이름들을 작성하였다.
- 이것들은 연결시킬 수 있도록 url에 이름을 부여해보자.
urlpatterns = [
path('', api_root),
path('snippets/', SnippetList.as_view(), name='snippet-list'),
path('snippets/<int:pk>/', SnippetDetail.as_view(), name='snippet-detail'),
path('snippets/<int:pk>/highlight/', SnippetHighlight.as_view(), name='snippet-highlight'),
path('users/', UserList.as_view(), name='user-list'),
path('users/<int:pk>/', UserDetail.as_view(), name='user-detail'),
]
실행해보기
- view에서 작성한 2개의 Response로 갈 수 있게 링크가 걸려있다.
- 각각의 링크를 클릭하면 해당 링크로 이동해서 결과를 보여준다.
http://127.0.0.1:8000/snippets/
serializer
에서 수정해서 바로 이동할 수 있도록 하이퍼링크가 걸려있다.
- json 형태로 봐도 링크가 걸려있다
- user detail로 들어갈 수 있는 링크와 유저가 생성한 snippet로 들어갈 수 있는 링크가 있다.
http://127.0.0.1:8000/users.json
페이지네이션 추가
- 한 페이지에 보여주고 싶은 page_size를 조정할 수 있다.
restapi > restapi > settings.py
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10
}
실행해보기
- 아까는 보이지 않았던
count
,next
,previous
가 생겼다.
728x90
LIST
'django' 카테고리의 다른 글
[Django REST framework] 7. 테스트 코드 작성 기본 (0) | 2022.03.06 |
---|---|
[Django REST framework] 6. ViewSets & Routers (0) | 2022.03.05 |
[Django REST framework] 4. Authentication& Permissions (0) | 2022.03.02 |
[Django REST framework] 3. Class-based Views (0) | 2022.02.28 |
[Django REST framework] 2. Response objects (0) | 2022.02.27 |
Comments