Python/Django

[Django] Request 구조 분석 (with. DRF, Query-String vs Path-variables)

yubi5050 2022. 8. 22. 15:58

DRF의 Requests 객체

https://www.django-rest-framework.org/api-guide/requests/

 

Requests - Django REST framework

 

www.django-rest-framework.org

 

메소드 종류 설명
request.method HTTP Request 메소드 종류
GET, POST, PUT, PATCH, DELETE 등
request.content_type body에 들어갈 Media type
request.data body에 들어가는 데이터 전체
request.FILES file 형식의 객체
request.FILES.getlist 여러 개의 file 형식 객체들 (list 형태)
request.query_params URL Query Parameter 반환 (QueryDict 형태)
request.query_params[<KEY>] URL Query Parameter 의 특정 KEY 값 
request.GET GET 메소드로 전달된 URL Parameters (QueryDict 형태)
request.GET[<KEY>] GET 메소드로 전달된 URL Parameters 의 특정 KEY 값, 없으면 에러
request.GET.get(<KEY>, <기본값>) GET 메소드로 전달된 URL Parameters 의 특정 KEY 값, 없으면 자동 기본값
request.POST POST 메소드로 전달된 Body data (QueryDict 형태)
request.POST[<KEY>] POST 메소드로 전달된 Body data 의 특정 KEY 값, 없으면 에러
request.POST.get(, <기본값>) GET 메소드로 전달된 Body data 의 특정 KEY 값, 없으면 자동 기본값
request.user 요청하는 user
request.auth 요청하는 user의 인증 context

 

 

DRF의 Requests - GET

# posts/request_test/id={}?a=1&b=2 채워서
def get(self, request, id):
    # Request Base
    print("request",request)
    print("request.method: ", str(request.method))
    print("request.content_type: ", request.content_type)

    # Request Data
    print("request.data: " , type(request.data), request.data)

    # Request - GET
    print("request.GET:", type(request.GET), request.GET) # QueryDict
    print("request.GET[<KEY>]:", request.GET['ex']) # 값 없을시 에러 발생
    print("request.GET.get(<KEY>, <default>):", request.GET.get('ex', None)) # 값없을시 None(기본값)

    # QUERY PARAMS 
    print("request.query_params:", request.query_params) # QueryDict
    print("request.query_params['ex']:", request.query_params['ex'])

    return Response({'success': True}, status=status.HTTP_200_OK)

 

GET Mehod 호출 결과

 

 

DRF의 Requests - POST

def post(self, request, id):
    # Request Base
    print("request",request)
    print("request.method: ", str(request.method))
    print("request.content_type: ", request.content_type)

    # Request Data
    print("request.data: " , type(request.data), request.data)
    print("request.stream: " , type(request.stream), request.stream)

    # Request User, Authentizaton
    print("request.user: " , type(request.user), request.user) # 로그인 유저 
    print("request.auth: " , type(request.auth), request.auth)

    # Request - Files
    print("request.FILES: ", type(request.FILES), request.FILES) # Form-data에 존재하는 file형식의 객체
    print("request.FILES.getlist: ", type(request.FILES.getlist), request.FILES.getlist('EX_FILES')) # getlist - 여러장의 이미지를 배열로 받음

    # Request - POST
    print("request.POST:", type(request.POST), request.POST) # Form-data에 존재하는 text형식의 객체
    print("request.POST[<KEY>]:", request.POST['aa']) # 값 없을시 에러 발생
    print("request.POST.get(<KEY>, <default>):", request.POST.get('aa', None)) # 값없을시 None(기본값)

    # QUERY PARAMS 
    print("request.query_params:", request.query_params) # QueryDict
    print("request.query_params['ex']:", request.query_params['ex'])

    return Response({'success': True}, status=status.HTTP_200_OK)

 

POST Mehod 호출 결과

 

 

API 예제

메소드 종류 urls.py URL (API Endpoint) 파싱 방법
공통 /test/<int:id> /test/3 def get(self, request, id)
GET /test /test?a=10

body : {}
request.query_params['a'] # 10

request.GET.get('a', None)
POST /test /test

body : {b:1, c:2}
request.POST.get('b', None)
POST /test /test?a=10

body : { b:2, c:3 }
request.query_params['a'] # 10

request.POST.get('b', None)

 

Query String vs Path varilable

Path variable : 어떤 자원(데이터)의 위치를 특정해서 보여줘야 할 경우
Query parameter : 정렬하거나 필터해서 보여줘야 할 경우 쓴다