DRF 의 요청 과 응답의 실현
1.1 요청
#
# from rest_framework.request import Request
def __init__(self, request, parsers=None, authenticators=None,
negotiator=None, parser_context=None):
# request, request drf request _request
self._request = request
def __getattr__(self,item):
return getattr(self._request,item)
# .data: ,
# ..query_params Django request.GET , 。
1.2 응답
#from rest_framework.response import Response
def __init__(self, data=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None):
#data: ,
#status: , 200,
-from rest_framework import status ,
#template_name ( ),
#headers: , ,
#content_type: ,application/json text/html;
# ,postman json , ( )
# postman , json
# drf ---》 setting , ,
# drf , --》 setting ---》
- :
-
from rest_framework.renderers import JSONRenderer
renderer_classes=[JSONRenderer,]
- : , ,
- setting.py
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( #
'rest_framework.renderers.JSONRenderer', # json
'rest_framework.renderers.BrowsableAPIRenderer', # API
)
}
2 보기
#
APIView
GenericAPIView
2.1 APIView 기반 인터페이스
#### views.py
from rest_framework.generics import GenericAPIView
from app01.models import Book
from app01.ser import BookSerializer
# APIView
class BookView(APIView):
def get(self,request):
book_list=Book.objects.all()
book_ser=BookSerializer(book_list,many=True)
return Response(book_ser.data)
def post(self,request):
book_ser = BookSerializer(data=request.data)
if book_ser.is_valid():
book_ser.save()
return Response(book_ser.data)
else:
return Response({'status':101,'msg':' '})
class BookDetailView(APIView):
def get(self, request,pk):
book = Book.objects.all().filter(pk=pk).first()
book_ser = BookSerializer(book)
return Response(book_ser.data)
def put(self, request,pk):
book = Book.objects.all().filter(pk=pk).first()
book_ser = BookSerializer(instance=book,data=request.data)
if book_ser.is_valid():
book_ser.save()
return Response(book_ser.data)
else:
return Response({'status': 101, 'msg': ' '})
def delete(self,request,pk):
ret=Book.objects.filter(pk=pk).delete()
return Response({'status': 100, 'msg': ' '})
#models.py
class Book(models.Model):
name=models.CharField(max_length=32)
price=models.DecimalField(max_digits=5,decimal_places=2)
publish=models.CharField(max_length=32)
#ser.py
class BookSerializer(serializers.ModelSerializer):
class Meta:
model=Book
fields='__all__'
# urls.py
path('books/', views.BookView.as_view()),
re_path('books/(?P<pk>\d+)', views.BookDetailView.as_view()),
2.2 Generic APIView 기반 인터페이스
# views.py
class Book2View(GenericAPIView):
#queryset queryset ,
# serializer_class
queryset=Book.objects
# queryset=Book.objects.all()
serializer_class = BookSerializer
def get(self,request):
book_list=self.get_queryset()
book_ser=self.get_serializer(book_list,many=True)
return Response(book_ser.data)
def post(self,request):
book_ser = self.get_serializer(data=request.data)
if book_ser.is_valid():
book_ser.save()
return Response(book_ser.data)
else:
return Response({'status':101,'msg':' '})
class Book2DetailView(GenericAPIView):
queryset = Book.objects
serializer_class = BookSerializer
def get(self, request,pk):
book = self.get_object()
book_ser = self.get_serializer(book)
return Response(book_ser.data)
def put(self, request,pk):
book = self.get_object()
book_ser = self.get_serializer(instance=book,data=request.data)
if book_ser.is_valid():
book_ser.save()
return Response(book_ser.data)
else:
return Response({'status': 101, 'msg': ' '})
def delete(self,request,pk):
ret=self.get_object().delete()
return Response({'status': 100, 'msg': ' '})
#url.py
# GenericAPIView
path('books2/', views.Book2View.as_view()),
re_path('books2/(?P<pk>\d+)', views.Book2DetailView.as_view()),
2.3 제 네 릭 APIView 와 5 개의 보기 확장 클래스 를 기반 으로 한 인터페이스
from rest_framework.mixins import ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin
# views.py
class Book3View(GenericAPIView,ListModelMixin,CreateModelMixin):
queryset=Book.objects
serializer_class = BookSerializer
def get(self,request):
return self.list(request)
def post(self,request):
return self.create(request)
class Book3DetailView(GenericAPIView,RetrieveModelMixin,DestroyModelMixin,UpdateModelMixin):
queryset = Book.objects
serializer_class = BookSerializer
def get(self, request,pk):
return self.retrieve(request,pk)
def put(self, request,pk):
return self.update(request,pk)
def delete(self,request,pk):
return self.destroy(request,pk)
# urls.py
# GenericAPIView+5
path('books3/', views.Book3View.as_view()),
re_path('books3/(?P<pk>\d+)', views.Book3DetailView.as_view()),
2.4 ModelViewSet 을 사용 하여 5 개의 인 터 페 이 스 를 작성 합 니 다.
# views.py
from rest_framework.viewsets import ModelViewSet
class Book5View(ModelViewSet): #5 ,
queryset = Book.objects
serializer_class = BookSerializer
# urls.py
# ModelViewSet 5
path('books5/', views.Book5View.as_view(actions={'get':'list','post':'create'})), # , get , Book5View list
re_path('books5/(?P<pk>\d+)', views.Book5View.as_view(actions={'get':'retrieve','put':'update','delete':'destroy'})),
2.5 소스 코드 분석 ViewSetMixin
# as_view
# ( , {'get':'list'}), get , list
for method, action in actions.items():
#method:get
# action:list
handler = getattr(self, action)
# ,handler list
setattr(self, method, handler)
# .get=list
#for .get: list .post: create
2.6 ViewSetMixin 의 보기 클래스 계승
# views.py
from rest_framework.viewsets import ViewSetMixin
class Book6View(ViewSetMixin,APIView): # APIVIew
def get_all_book(self,request):
print("xxxx")
book_list = Book.objects.all()
book_ser = BookSerializer(book_list, many=True)
return Response(book_ser.data)
# urls.py
# ViewSetMixin ,
path('books6/', views.Book6View.as_view(actions={'get': 'get_all_book'})),
무엇이 정방 향 대리 이 고,무엇이 역방향 대리 입 니까?정방 향 프 록 시 대상 은 클 라 이언 트 이 고,역방향 프 록 시 대상 은 서버 입 니 다.
DRF 의 요청 과 응답의 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 DRF 요청 과 응답 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 읽 어 주시 기 바 랍 니 다.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
django rest framework : swagger다음 기사를 시도한 가정. rest framework로 만든 api 목록을 자동으로 생성합니다. swagger module 사용 아래 참조되었습니다. 활성화된 경로 목록이 표시됨 rest_project/setting...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.