πŸ‘¦ 내일배움캠프/TIL(Today I Learned)

TIL_220614_νŒ€ ν”„λ‘œμ νŠΈ django

  • -

κΈΈλ©΄μ„œλ„ μ§§μ•˜λ˜ 10μΌκ°„μ˜ django νŒ€ ν”„λ‘œμ νŠΈκ°€ 끝이 났닀.

 

많이 μ•„μ‰¬μ› λ˜ 점도 μžˆμ—ˆκ³ , μΆ©λΆ„ν•œ μ—­λŸ‰κ³Ό λ‚˜ μžμ‹  슀슀둜 정말 μ—΄μ‹¬νžˆ ν–ˆλ‚˜? λΌλŠ” 생각이 λ“œλŠ” μ‹œκ°„μ΄μ˜€λ‹€.

늘 λŒ€λ‹¨ν•œ 캠퍼 μ‚¬λžŒλ“€μ˜ μ—­λŸ‰μ„ ν™•μΈν•˜λ©΄μ„œ 동기뢀여도 λ°›μ§€λ§Œ, κ·Έλ§ŒνΌμ΄λ‚˜ 따라가지 λͺ»ν•˜λŠ” λ‚΄ μžμ‹ μ—κ²Œ μ‹€λ§ν•œ 일이 μ—¬λŸ¬λ²ˆ μžˆμ—ˆλ‹€.

 

 

κ·Έλž˜λ„..

 

κ·Έλ‚˜λ§ˆ 닀행이라면 λ‚˜λŠ” ν¬κΈ°ν•˜μ§€ μ•Šμ•˜κ³ , 성취감을 μ–»μ—ˆκ³ , 재미λ₯Ό μ–»μ—ˆλ‹€.

 

이 λ‹€μŒμ˜ λ‚˜λŠ” 더 재미있게 즐기고 μžˆλŠ” λ‚˜ μžμ‹ μ„ 꿈꾸며 μ—΄μ‹¬νžˆ ν•΄λ³΄κ³ μž ν•œλ‹€.

 


 

KPT 회고

KEEP

ν˜‘μ—…

  • 쑰금 더 μƒμ„Έν•œ 와이어 ν”„λ ˆμž„ μž‘μ„±. (색상 μ½”λ“œ 포함)
  • ν™”λ©΄ 곡유λ₯Ό 톡해 μ¦‰μ„μ—μ„œ 상황을 κ³΅μœ ν•˜κ³  ν•¨κ»˜ 확인
  • μ „ ν”„λ‘œμ νŠΈλ³΄λ‹€ ν–₯μƒλœ μˆ˜μ€€μ˜ git μ‚¬μš© (λΆ€λ‹΄ μ—†λŠ” 병합)
  • 적극적인 νŒ€μ› ν™œμš©(νŠœν„°λ‹˜μ—κ²Œ κ°€κΈ° 전에 νŒ€μ›μ—κ²Œ 묻기)
  • μ—­ν•  λΆ„λ‹΄ μ‹œ μžμ‹  μ—†λŠ” λΆ€λΆ„ μœ„μ£Όλ‘œ λ°°μ •
  • 사전 κ³„νšν•œ νŒ€ μΌμ •λŒ€λ‘œ ν”„λ‘œμ νŠΈ 진행
  • 각 λ‹΄λ‹Ή κΈ°λŠ₯ 별 체크리슀트 μž‘μ„±(기획)

기술

  • 기쑴에 λ°°μš°μ§€ μ•Šμ€ μž₯κ³  κΈ°λŠ₯ ν™œμš©
  • VScode의 Live Share κΈ°λŠ₯ μ²΄ν—˜
  • 파일의 체계적인 λΆ„ν•  ( Css, HTML )
  • 졜근 ν•™μŠ΅ λ‚΄μš©μ„ 적극적으둜 ν”„λ‘œμ νŠΈμ— 적용
    • url name ν™œμš©
  • ν–₯μƒλœ 파이썬 문법 μ‚¬μš© ( ν•¨μˆ˜μ˜ 인자 ν˜•μ‹ )
  • ν”„λ‘ νŠΈ 관련은 클둠 μ½”λ”© ν™œμš©

 

PROBLEM

ν˜‘μ—…

  • git issue κΈ°λŠ₯을 ν™œμš©ν•˜μ§€ λͺ»ν•¨
  • APIλ¬Έμ„œ ν™œμš© 및 μ΅œμ‹ ν™” λΆ€μ‘±
  • 각자 λ‹€λ₯Έ 뢈러올 파일의 경둜 ex) wine_data.csv
  • νŒ€μ› 개개인의 일정 관리 미흑

기술

  • 넀이밍 방식 ( ν•¨μˆ˜, url, css 클래슀 )
  • aws 배포 μ‹€νŒ¨

 

TRY

ν˜‘μ—…

  • git issue μ²΄κ³„μ μœΌλ‘œ μ‚¬μš©
  • git commitμ‹œ 본인 ν•΄λ‹Ή 파일만 선택

기술

  • VScode의 Live Share κΈ°λŠ₯ ν™œμš© ( λ™μ‹œ μ½”λ“œ μž‘μ„± )
  • λΆ€νŠΈμŠ€νŠΈλž© ν™œμš© ( λ°±μ—”λ“œμ— 집쀑 )
  • postman ν™œμš© ( JsonResponse )
  • 배포 ν•˜κΈ° ( aws )

 

λŠλ‚€μ 

  • λ‚˜**
    • μ§€λ‚œ ν”„λ‘œμ νŠΈμ— λΉ„ν•΄ λ§€λ„λŸ½κ²Œ μ§„ν–‰λ˜μ—ˆλ‹€. κ°•μ˜μ™€ 거뢁이반, νŠΉκ°• λ“±μ—μ„œ 배운 λ‚΄μš©μ˜ ν™œμš©λ„κ°€ μ˜¬λΌκ°”λ‹€. ν•™μŠ΅ν•œ λ‚΄μš© μ™Έμ˜ κΈ°μˆ λ“€μ„ μ‚¬μš©ν•œ 뢀뢄은 μ’‹μ•˜μœΌλ‚˜ 기초적인 μˆ˜μ€€μ— λ¨Έλ¬Όλ €λ˜ 점이 ν•œκ³„λΌκ³  λŠκ»΄μ‘Œλ‹€. μž₯κ³ κ°€ μ œκ³΅ν•˜λŠ” 툴 듀을 λͺ¨λ₯΄λ‹€ λ³΄λ‹ˆ 둜직으둜 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ½”λ“œκ°€ μ§€μ €λΆ„ν•΄μ‘Œλ‹€. 파이썬의 객체지ν–₯ 방식을 적절히 ν™œμš©ν•˜μ§€ λͺ»ν–ˆλ‹€. ν”„λ‘œμ νŠΈ μ˜ˆμƒ 일정에 크게 λ²—μ–΄λ‚˜μ§€ μ•Šμ•„ ν›„λ°˜ μž‘μ—…μ˜ 뢀담이 덜 ν–ˆλ‹€.
  • ν•œ**
    • 이번 ν”„λ‘œμ νŠΈ 기간이 μ§€λ‚œλ²ˆμ— λΉ„ν•΄ κΈΈμ—ˆμ§€λ§Œ, 쀑간에 AWS κ°•μ˜λ₯Ό λ“£λŠ” μ‹œκ°„ λ“± ν•  게 생각보닀 λ§Žμ•„μ„œ μ‹œκ°„μ΄ λ§Žλ‹€κ³  λŠλΌμ§€ λͺ»ν•˜μ˜€λ‹€. κ°•μ˜λ„ μ™„κ°•ν•˜μ§€ λͺ»ν•˜μ—¬ μ‹œκ°„μ΄ λ‚¨λŠ” λŒ€λ‘œ μˆ˜κ°• μ˜ˆμ •…. Django에 λ°°μš°μ§€ μ•Šμ€ κΈ°λŠ₯듀이 λ§Žλ‹€λŠ” κ±Έ μ•Œκ²Œλ˜μ—ˆκ³ , κΈ°νšŒκ°€ 되면 κ·Έ κΈ°λŠ₯듀을 ν™œμš©ν•˜λŠ” 것을 μƒκ°ν•΄λ³΄μ•˜λ‹€.
  • μ΄λ™ν˜„
    • Try λ₯Ό 톡해 κΈ°νšμ„ λ³΄κ°•ν•˜κ³  κ°œμ„ λœ λ°©ν–₯으둜 ν”„λ‘œμ νŠΈλ₯Ό μž„ν•  수 μžˆμ—ˆμŒ. django 의 λ°±μ—”λ“œ κΈ°λŠ₯듀을 μ‚¬μš©ν•˜λ©΄μ„œ μ•„μ§κΉŒμ§€λ„ 이해가 λΆ€μ‘±ν•˜κ³  λ―Έμˆ™ν•˜μ§€λ§Œ, 배우고 μ‘μš©ν•˜λ©΄μ„œ μ œλŒ€λ‘œ ν™œμš©ν•˜λŠ” 성취감과 재미λ₯Ό λŠλ‚„ 수 μžˆμ—ˆμŒ. ν”„λ‘œμ νŠΈ 진행 쀑에 AWS κ°•μ˜μ™€ λ³‘ν–‰ν•˜λŠ” 것이 쉽지 μ•Šμ•˜μŒ. κ±°λΆμ΄λ°˜μ„ 톡해 ν”„λ‘œμ νŠΈμ— 큰 도움이 λ˜μ—ˆμŒ. κ°•μ˜ λ‚΄μš©μ˜ κΈ°λŠ₯ 뿐만 μ•„λ‹ˆλΌ 싀무에 도움이 될 수 μžˆλŠ” λ‚΄μš©λ“€λ‘œ 배울 수 μžˆμ—ˆμŒ νŒ€μ›μ„ 톡해 ν”„λ‘œμ νŠΈ μ§„ν–‰ν•˜λŠ”λ° μžˆμ–΄ 이해λ₯Ό 도움 λ°›κ³ , λ§Žμ€ 배움을 μ–»μ—ˆμŒ. μžμ‹ μ΄ μ›ν•˜λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ, μ§€κΈˆλ³΄λ‹€ 더 적극적인 질문과 μžμ„Έλ‘œ μž„ν•  ν•„μš”κ°€ 있음.

 


 

νŒ€ ν”„λ‘œμ νŠΈμ˜ 쀑점 κ΅¬ν˜„ κΈ°λŠ₯

μ‹€μ‹œκ°„ 크둀링(이미지)

- κΈ°λŠ₯ μ„€λͺ… : λ§Žμ€ 데이터 정보λ₯Ό λΆˆλŸ¬μ˜€λŠ” 뢀담이 μ»€μ„œ μ‹€μ‹œκ°„ 크둀링으둜 정보λ₯Ό κ°€μ Έμ˜΄.

- 포인트 : ν•¨μˆ˜μ˜ μΈμžκ°’μœΌλ‘œ 리슀트둜 감싸진 였브젝트λ₯Ό 넣을 수 있음. (target_wines)

- μ½”λ“œ

def wine_crawling(target_wines):
    for target_wine in target_wines:

        name_split_list = target_wine.name.split(',')
        search_name = '+'.join(name_split_list)
        year = target_wine.year
        url = f'https://www.vivino.com/search/wines?q={search_name}+{year}'

        headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'}
        wine = requests.get(url, headers=headers)
        soup = BeautifulSoup(wine.content, 'html.parser')

        if target_wine.av_rating == 0:
            try:
                wine_av = soup.select_one('.average__number').text
                wine_av = wine_av.strip('\n')
                if wine_av == '—':
                    wine_av = str(0.0)
            except:
                wine_av = 0.0
        else:
            wine_av = target_wine.av_rating

        try:
            target_element = soup.select_one('figure')['style']
        except:
            target_element = 0.0
        try:
            img_url = re.findall('\(([^)]+)', target_element)
            img_url = img_url[0].replace('//', '')
        except:
            img_url = 0.0

        try:
            target_wine.av_rating = wine_av
            target_wine.img_url = img_url
            target_wine.save()
        except:
            pass

    return target_wines

 

별점 κΈ°λŠ₯

- κΈ°λŠ₯ μ„€λͺ… : 리뷰가 λ‹¬λ¦¬λ©΄μ„œ μ‹€μ‹œκ°„μœΌλ‘œ μ‚¬μš©μžκ°„μ˜ 리뷰 데이터λ₯Ό λ°›μ•„ 평점을 ν‰κ· ν™”ν•˜μ—¬ μ—…λ°μ΄νŠΈ κΈ°λŠ₯ 적용

- μ½”λ“œ

# wineμ •λ³΄μ—μ„œ av_rating λ³€κ²½
        rating_list = RatingModel.objects.filter(wine=wine)
        rating = 0
        for i in range(0, len(rating_list)):
            rating += rating_list[i].rating
        
        wine.av_rating = rating/len(rating_list)
        wine.save()

 

μœ μ‚¬λ„ κ²°μ •

- κΈ°λŠ₯ μ„€λͺ… : ITEM 기반 μœ μ‚¬λ„ κΈ°λŠ₯을 체택, μ•½ 8000개의 데이터λ₯Ό 각각의 정보와 μœ μ‚¬λ„λ₯Ό λΉ„κ΅ν•΄μ„œ μ›ν•˜λŠ” 정보λ₯Ό 좜λ ₯.

- μ½”λ“œ

def similarity(id):
    sim = []
    for i in range(0, len(tmp)):
        sim.append(cos_sim(tmp.iloc[id-1].values, tmp.iloc[i].values))

    coss = pd.DataFrame({'id' : df['id'][0:].tolist(), 'sim' : sim})

    sim_wines = pd.concat([df.reset_index().drop('index', axis=1), coss.drop('id', axis=1)], axis=1).sort_values(by=['sim'], ascending=False)[1:20]
    
    return sim_wines

 

μ‚¬μš©μž ν•¨μˆ˜ μ •μ˜

- κΈ°λŠ₯ μ„€λͺ… : enumerate λ₯Ό μ‚¬μš©ν•˜λ € ν–ˆμœΌλ‚˜, κΈ°λŠ₯이 μ μš©λ˜μ§€ μ•Šμ•„ μ‚¬μš©μž ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜μ—¬ 인덱슀λ₯Ό μ‚¬μš©.

- but : ν•¨μˆ˜ μΈμžκ°’μœΌλ‘œ 였브젝트λ₯Ό μ‚¬μš©, 인덱슀 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ²Œ 됨.

- μ½”λ“œ

# templatetags/index.py

from django import template
register = template.Library()

@register.filter
def index(indexable, i):
    return indexable[i]

 

django messages κΈ°λŠ₯ μ‚¬μš©

- κΈ°λŠ₯ μ„€λͺ… : html 에 메세지 정보λ₯Ό 좜λ ₯ν•˜κ³ μž κΈ°λŠ₯ μ‚¬μš©.

- info 이외에도 μ—¬λŸ¬ νƒ€μž… μ‚¬μš© κ°€λŠ₯

- μ½”λ“œ

# settings.py
INSTALLED_APPS = [
    'django.contrib.messages',
]

# views.py
messages.info(request, '곡백은 μž…λ ₯ν•  수 μ—†μŠ΅λ‹ˆλ‹€.')
Contents

ν¬μŠ€νŒ… μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€

이 글이 도움이 λ˜μ—ˆλ‹€λ©΄ 곡감 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.