일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- Exercism
- 예술영화추천
- join()
- 파이썬 웹프로그래밍 장고
- Bookmark
- 개발
- 북마크앱
- ART_Cinema
- 독립영화플랫폼
- 북마크만들기
- 장고 개발 순서
- til
- 장고
- 타사인증
- Algorithm
- MyPick31
- 장고 프로젝트 순서
- Django
- mongodb
- python
- Django Blog
- 프로젝트
- Blog
- 장고 프로젝트
- Node.js
- 자바스크립트
- MYSQL
- 알고리즘
- JavaScript
- passport.js
- Today
- Total
Juni_Dev_log
20.11.15 (MyPick-31) TIL 본문
(문제①) python 에서 if / elif / else 구문에서 사용한 변수를 계속해서 사용하려고하는데, 변수 선언이 안되었다는 오류가 발생.
if / elif / else 구문에서 반환하려고 하는 값을 return 에 담아서 마무리를 지어줘야 다음 과정에서도 계속 변수로 사용할 수 있다.
또한, if문을 통해서 받아온 아이스크림 flavor 가 없을 경우에는 if 조건문을 통한 결과로 pass를 실행해서 코드의 실행 시간을 단축시켰다.
pass와 비슷한 기능으로 break, continue 라는 것이 있는데,
해당 글을 참고해보면, 나의 경우에는
def signature_filtering_cbase1(flavor):
print(signature_final_flavor)
print(flavor)
# cbase1 값이 없을 때
if flavor == "":
print('base1 없어!')
pass
# cbase1 값이 있을 때
elif flavor != "":
cbase1 = list(db.signature.find({'base':{'$regex': flavor}},{'_id':0}))
for i in range(len(cbase1)):
cbase1_name = cbase1[i]['name']
signature_final_flavor.append(cbase1_name)
print(signature_final_flavor)
return signature_final_flavor
만약 flavor 값이 없을 때는 굳이 db에서 찾는 과정을 하지 않아도 되기 때문에, pass 를 통해서 다음 함수를 실행하도록 함수 실행 시간을 단축시켰다.
이처럼 상황에 맞게 pass 와 break 그리고 continue를 사용하면 코드의 실행 속도를 단축화시킬 수 있을 듯하다.
(문제②) 전역변수와 지역변수의 Scope 범위가 헷갈리기 시작한다. 전역변수를 통해, 빈 배열을 가진 전역변수를 생성했는데, 작업을 반복하면 할수록 전역변수가 빈 배열로 초기화되지 않았다.
해당 글을 참고해보니, 함수 내에서 전역변수를 선언할 때
# bring_signature_db
@app.route('/bring_signature_ice_cream', methods=['POST'])
def bring_signature_ice_cream():
# 함수 내에서 전역변수로 선언
global signature_final_flavor
print('////signature/////')
receive_ice_cream = json.loads(request.form['ice_cream'])
ice_cream = list(receive_ice_cream.values())
# 모든 아이스크림을 가져올 때
if ice_cream == []:
print('모든 아이스크림 가져오기')
bring_signature_db = list(db.signature.find({},{'_id':0}))
return(jsonify({'result':'success_1','data':bring_signature_db}))
#필터링으로 아이스크림을 가져올 때
else:
print('필터링 아이스크림 가져오기')
# 선언한 전역변수에 빈 배열 넣기
signature_final_flavor = []
print(signature_final_flavor)
temp_flavor = ice_cream[0]
print(temp_flavor)
for i in range(len(temp_flavor)):
print(i)
if i == 0 :
print(signature_final_flavor)
signature_filtering_cbase1(temp_flavor[i])
if i == 1 :
signature_filtering_cbase2(temp_flavor[i])
if i == 2 :
signature_filtering_ctopping1(temp_flavor[i])
if i == 3 :
signature_filtering_ctopping2(temp_flavor[i])
if i == 4 :
signature_filtering_csyrup1(temp_flavor[i])
if i == 5 :
signature_filtering_csyrup2(temp_flavor[i])
print('-----------')
print(signature_final_flavor)
print(len(signature_final_flavor))
위의 코드에서처럼 함수 내에서 global 을 사용해서 전역변수 선언을 해주면 그 함수 내에 있는 모든 함수들에서 사용할 수 있게 된다.
global 을 이용해서 signature_final_flavor 를 선언하고 필터링할 때 걸리는 else 구문에서 signature_final_flavor 에 [ ] 빈 배열을 정의해주면서 해당 기능을 구현했다.
(문제③) db에서 필터링한 정보들을 가져왔는데, 이미 나열되어있는 카드를 초기화시켜준 뒤(깨끗하게 없앤 뒤), append 를 통해서 카드를 붙여야하는데 기존에 있던 카드가 계속 연달아 붙은 형태로 뒤죽박죽이 되었다.
najaehwa.tistory.com/entry/jQuery-removeempty
append() 를 하기 전에, 기존에 있었던 정보들을 보여줬던 html 카드를 지워야하기 때문에, 요소의 내용을 지우는 empty() 를 사용해서 하위 요소들을 모두 지우고 append()를 했다.
//db에서 signature 아이스크림 데이터를 가져와서 카드로 배열하는 함수
function bring_signature_db(ice_cream) {
bring_ice_cream = ice_cream
jQuery.ajaxSettings.traditional = true; // ajax로 배열 보낼때..
$.ajax({
type: "POST",
url: "/bring_signature_ice_cream",
data: {ice_cream: [JSON.stringify({bring_ice_cream: bring_ice_cream})]},
success: function (response) {
// 필터링한 아이스크림을 리스팅할 때
if (response['result'] == 'success_2') {
datas = response['data']
console.log('필터링 아이스크림을 조회합니다.')
// 카드를 붙이기 전에 초기화 (empty) 시켜주고, append
$('.ice-cream_contents').empty();
for (let i = 0; i < datas.length; i++) {
signature_listing_card(i, datas[i][0]['id'], datas[i][0]['name'], datas[i][0]['name_eng'], datas[i][0]['base'], datas[i][0]['topping'], datas[i][0]['syrup'])
}
}
// 모든 아이스크림 리스팅할 때
else if (response['result'] == 'success_1') {
datas = response['data']
console.log('모든 아이스크림을 조회합니다.')
// 카드를 붙이기 전에 초기화 (empty) 시켜주고, append
$('.ice-cream_contents').empty();
for (let i = 0; i < datas.length; i++) {
signature_listing_card(i, datas[i]['id'], datas[i]['name'], datas[i]['name_eng'], datas[i]['base'], datas[i]['topping'], datas[i]['syrup'])
}
}
}
})
}
내 코드에서 먼저 실행되는 함수는 bring_signature_db() 이기 때문에, 해당 코드에서 for문을 통해서 card 형식으로 붙이는 함수가 실행되기전에, empty() 를 해줘야한다.
(문제④) 다음에 할 부분!
'Project > MyPick-31(Dev)' 카테고리의 다른 글
20.11.28 (MyPick-31) TIL (0) | 2020.11.28 |
---|---|
20.11.22 (MyPick-31) TIL (0) | 2020.11.23 |
20.11.21 (MyPick-31) TIL (0) | 2020.11.22 |
20.11.14 (MyPick-31) TIL (0) | 2020.11.15 |
'배스킨라빈스 31' 아이스크림 추천 웹 서비스 (0) | 2020.09.22 |