git : https://github.com/dothouse/practice/tree/master/project1/web
Tool : python / python-flask / html /javascript / css
✅사용 파일
D:\song\practice\project1\web\jeju\views\select3_views.py
https://github.com/dothouse/project1/blob/master/web/jeju/views/select2_views.py
D:\song\practice\project1\web\jeju\templates\select\select3.html
https://github.com/dothouse/project1/blob/master/web/jeju/templates/select/select2.html
D:\song\practice\project1\web\jeju\views\select3_views.py
@bp.route('/select3', methods=('GET', 'POST'))
def show_select3():
select_value = db.session.query(selectData).order_by(selectData.id.desc())[0]
db.session.query(selectData)
-> selectData 테이블의 값들을 불러오기
db.session.query(selectData).order_by(selectData.id.desc())[0]
-> id columns 값이 가장 작은 값을 불러와라
### query filtering
selected_query = db.session.query(Pension)
if select_value.pet == 1:
selected_query = selected_query.filter(Pension.ammen.like('%반려동물%'))
if select_value.pool == 1:
selected_query = selected_query.filter(Pension.ammen.like('%수영장%'))
if select_value.garden == 1:
selected_query = selected_query.filter(Pension.ammen.like('%마당%'))
if select_value.sea == 1:
selected_query = selected_query.filter(Pension.ammen.like('%바다%'))
if select_value.nocost == 1:
selected_query = selected_query.filter(Pension.ammen.like('%관리비 없음%'))
if select_value.bus == 1:
selected_query = selected_query.filter(Pension.ammen.like('%대중교통%'))
result_query = selected_query.all()
if select_value.pet == 1: selected_query = selected_query.filter(Pension.ammen.like('%반려동물%'))
if select_value.pet == 1: 앞선 페이지에서 반려동물 동반을 선택한 경우
selected_query = selected_query.filter(Pension.ammen.like('%반려동물%'))
-> Pension 테이블에서 ammen 컬럼에서 반려동물이 포함된 data 선택
불러온 데이터를 파이썬을 활용해서 계산
일정 거리 이내의 시설을 계산하고자 함.
-> 거리를 계산하고, 경계보다 안쪽에 있을 경우 cnt값에 1을 할당
-> cnt가 1인 경우 만 숙소 점수 계산에 활용
# 선택값이 없는 (yes or no)테이블 계산
pension_data = db.session.query(Pension).all()
non_distance = []
non_table_list = ['Police', 'Hospital', 'Bank', 'Mart', 'Parm', 'Gift']
for data in non_table_list:
temp_data = db.session.query(globals()[str(data)]).all()
for j in range(len(pension_data)):
cnt = 0
pensionID = pension_data[j].pensionID
for i in range(len(temp_data)):
start = (temp_data[i].lat, temp_data[i].lng)
goal = (pension_data[j].latitude, pension_data[j].longitude)
haver = haversine(start, goal)
# 거리 설정
if data == 'Mart':
bound = 5
elif data == 'Police':
bound = 20
elif data == 'Bank':
bound = 10
elif data == 'Hospital':
bound = 3
elif data == 'Parm':
bound = 3
elif data == 'Gift':
bound = 10
if haver < bound:
cnt += 1
non_distance.append([pensionID, cnt, data, bound])
# 선택값이 있는 테이블 계산 - Tour 13의 경우 Tour 11 / 12 일때 모두 포함
yes_distance = []
table_list = [('Tour', select_value.spot2), ('Food', select_value.food)]
for data, selected in table_list:
temp_data = db.session.query(globals()[str(data)])
if ((data == 'Tour') & ((selected % 10) == 1)):
temp_data2 = temp_data.filter(
(globals()[str(data)].detailtype == selected) | (globals()[str(data)].detailtype == selected + 2)).all()
elif ((data == 'Tour') & ((selected % 10) == 2)):
temp_data2 = temp_data.filter(
(globals()[str(data)].detailtype == selected) | (globals()[str(data)].detailtype == selected + 2)).all()
else:
temp_data2 = temp_data.filter(globals()[str(data)].detailtype == selected).all()
for j in range(len(pension_data)):
cnt = 0
pensionID = pension_data[j].pensionID
for i in range(len(temp_data2)):
start = (temp_data2[i].lat, temp_data2[i].lng)
goal = (pension_data[j].latitude, pension_data[j].longitude)
haver = haversine(start, goal)
bound = 10
if haver < bound:
cnt += 1
yes_distance.append([pensionID, cnt, data, bound])
count_list = non_distance + yes_distance
df_count = pd.DataFrame(count_list)
df_count.columns = ['pensionID', 'cnt', 'data', 'bound']
✅ view 파일, @bp.route('/select3', methods=('GET', 'POST')) def show_select3(): 안에 함수를 만들경우 해당 부분에서만 함수 작동가능
▶ 전체에 적용하기 위해서는 패키지 형태로 만들어 저장
filter.py가 그 예시
return render_template("select/select3.html",
result=result_query,
pension1_score=pension1_score, pension2_score=pension2_score, pension3_score=pension3_score,
pension1_chk=pension1_chk, pension2_chk=pension2_chk, pension3_chk=pension3_chk,
pension1_detail=pension1_detail, pension2_detail=pension2_detail, pension3_detail=pension3_detail,
non_distance=count_list, select_value=select_value)
non_distance=count_list
methods=('GET', 'POST')의 설정을 함