티스토리 뷰
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 |
- Total
- Today
- Yesterday
- authenticate()
- git 공부
- 면접을 위한 CS 전공 지식 노트
- git공부
- Spring
- 톰캣
- 혼자 공부하는 파이썬
- 회원 로그인
- musma
- path variable
- django
- 암호화
- git
- error: failed to push some refs to 'https://github.com/
- Java
- django.contrib.auth
- 환경 변수 설정
- 회원가입
- 웹페이지
- Django tutorial
- 디자인 패턴
- 검색 결과 내 페이지네이션
- 한글 형태소 분석기
- Magazine K
- 배열
- django-environ
- python3
- API
- 커맨드 객체
- Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |