티스토리 뷰

study/Django

Django - Query String

xoxowo 2022. 8. 17. 14:28

2차 프로젝트를 진행하면서 사용해보지 않았던 query parameter(string)를 구현해봤기 때문에 잊기 전에 정리해본다. 

 

Query string

클라이언트가 웹사이트에서 입력한 데이터를 전달하는데 가장 널리 사용되는 방법이라고 한다.

가끔 웹사이트의 url주소가 매우 길 때 유심히 보면 물음표(?)로 시작하고 키=값&키=값으로 연결되어있는 부분이 query string이 적용된 부분이다.

https://flights?depctycd=GMP&depctycd=CJU&arrctycd=CJU&arrctycd=GMP&depdt=2022-08-24

 

항공권 리스트 페이지의 경우 사용자로부터 입력받은 데이터를 받아와야 하기 때문에 urls.py의 url 주소는 ' ' 비어있게 설정해줬다.

# flights/urls.py 파일

from flights.views import FlightListView

urlpatterns = [
    path('', FlightListView.as_view()),
]

 

사용자가 지정한 일자에 대한 항공권 리스트를 전달하기 위해 사용자가 입력한 데이터를 query string으로 받아온다.

 

필수 값인 경우 data = request.GET을 앞서 먼저 선언한 뒤 data ['']로 값을 받아오고, 아닌 경우 예외 처리한다.

필수 값이 아닌 경우 request.GET.get( )또는 request.GET.getlist()로 값을 받아온다.

# flights/views.py 파일

class FlightListView(View):
    def get(self, request):
        try: # 클라이언트가 필수로 값을 받아와야하는 경우 data['']로 값을 받아온다. 못받아올경우 예외처리
            data             = request.GET
            departure_name   = data['departure_name']
            destination_name = data['destination_name']
            departure_date   = data['departure_date']
            return_date      = request.GET.get('return_date', 0)
            passengers       = data['passenger']
            airlines         = request.GET.getlist('airline', ['HoneyAirline','MoonAirline'])
            sort_type        = request.GET.get('sort_by','lowest_fare')
            offset           = int(request.GET.get('offset', 0))
            limit            = int(request.GET.get('limit', 5))
            
            # 이하 생략 ..

 

request.GET.get()

 

아래 return_date는 사용자(클라이언트)가 항공편을 편도로 예약할 때 돌아오는 날을 선택하지 않기 때문에 request.GET.get()을 사용했다. 이때 사용자가 돌아오는 날을 입력하지 않으면 괄호안의 'return_date'의 다음인 0을 기본 값으로 앞 변수인 return_date에 들어가게되고 만약 사용자가 돌아오는 일자를 넣게되면 'return_date'에 입력한 값이 변수인 return_date에 들어가게된다.

return_date = request.GET.get('return_date', 0 )

 

request.GET.getlist()

 

get()과 마찬가지로 사용자가 항공편 검색 시 항공사를 선택하지 않기 때문에 모든 항공사의 비행 스케줄을 보여줘야 해서, 이때는 request.GET.getlist() 사용하여 여러 값(항공사)들을 미리 기본값으로 설정해두었다.

위 문자 그대로 리스트 형식이기 때문에 값을 대괄호[] 안에 넣어줘야한다.

사용자가 입력하지 않았을 때 기본값으로 괄호 안 ['HoneyAirline, 'MoonAirline'] 리스트가 들어가기 때문에 항공 스케줄에 모든 항공의 스케줄이 표기되며, 사용자가 특정 항공사만 보고 싶어 체크박스를 해제하면 특정 항공사만 'airline'으로 값이 들어와 해당 항공사의 값만 볼 수 있다. 영상을 보면 조금 더 쉽게 이해할 수 있을..?🙄 (프로젝트 때 항공사는 2개만 넣었기 때문에 최대 값이 2개다.)

airlines = request.GET.getlist('airline', ['HoneyAirline', 'MoonAirline'])

 

 

 

 메인 페이지에서 사용자가 여행을 가고싶은 조건 (출발지, 도착지, 출발일자, 리턴 일자, 탑승객 ) 정보로 요청할 경우

http://127.0.0.1:8000/flights?departure_name=Seoul&destination_name=Cancun&departure_date=13&return_date=20&passenger=1&airline=MoonAirline

db에 저장되어있는 해당값들을 필터링하여 조건에 맞는 모든 데이터가 정상적으로 전송됨

{
    "departure_list": [
        {
            "flight_detail_id": 840,
            "flight_route_code": "MO689",
            "departure_location": "Seoul",
            "departure_location_korean": "서울",
            "departure_airport_code": "SEL",
            "destination_location": "Cancun",
            "destination_location_korean": "칸쿤",
            "destination_airport_code": "CUN",
            "month": 8,
            "date": 13,
            "day": 6,
            "airline": "MoonAirline",
            "airline_url": "2",
            "departure_time": "01:00",
            "arrival_time": "14:00",
            "flight_time": 11,
            "price": "3729400.00",
            "remaining_seats": 50,
            "passengers": "1"
        },
        {
            "flight_detail_id": 866,
            "flight_route_code": "MO689",
            "departure_location": "Seoul",
            "departure_location_korean": "서울",
            "departure_airport_code": "SEL",
            "destination_location": "Cancun",
            "destination_location_korean": "칸쿤",
            "destination_airport_code": "CUN",
            "month": 8,
            "date": 13,
            "day": 6,
            "airline": "MoonAirline",
            "airline_url": "2",
            "departure_time": "02:10",
            "arrival_time": "15:15",
            "flight_time": 11,
            "price": "3800000.00",
            "remaining_seats": 91,
            "passengers": "1"
        },
  			# .. 중간 생략
    ],
    "return_list": [
        {
            "flight_detail_id": 1939,
            "flight_route_code": "MO589",
            "departure_location": "Cancun",
            "departure_location_korean": "칸쿤",
            "departure_airport_code": "CUN",
            "destination_location": "Seoul",
            "destination_location_korean": "서울",
            "destination_airport_code": "SEL",
            "month": 8,
            "date": 20,
            "day": 6,
            "airline": "MoonAirline",
            "airline_url": "2",
            "departure_time": "03:05",
            "arrival_time": "16:00",
            "flight_time": 11,
            "price": "4000000.00",
            "remaining_seats": 50,
            "passengers": "1"
        },
        {
            "flight_detail_id": 2017,
            "flight_route_code": "MO589",
            "departure_location": "Cancun",
            "departure_location_korean": "칸쿤",
            "departure_airport_code": "CUN",
            "destination_location": "Seoul",
            "destination_location_korean": "서울",
            "destination_airport_code": "SEL",
            "month": 8,
            "date": 20,
            "day": 6,
            "airline": "MoonAirline",
            "airline_url": "2",
            "departure_time": "11:15",
            "arrival_time": "23:25",
            "flight_time": 12,
            "price": "4500000.00",
            "remaining_seats": 7,
            "passengers": "1"
        }
    ]
}

 

→ 사용자가 유효하지않은 조건을 요청할 경우 (보통은 입력값을 고르지 않으면 넘어가지 않기 때문에 드물다..)

    필수조건 중 하나인 출발일자를 넣지 않았을 경우

http://127.0.0.1:8000/flights?departure_name=Seoul&destination_name=Cancun&return_date=20&passenger=1&airline=MoonAirline

필수 조건 중 하나인 출발 일자를 넣지 않았을 경우 예외처리를 했기 때문에 400 error가 발생한다.

{
    "message": "Key_Error"
}

'study > Django' 카테고리의 다른 글

Django - Query string 2  (0) 2022.09.07
CSRF - Cross Site Request Forgeries  (0) 2022.09.05
Django - 동일한 테이블을 참조하는 ForeignKey  (0) 2022.07.31
Django -path Variable  (0) 2022.07.24
Django - JWT 발급  (0) 2022.07.13
댓글