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, '곡백μ μ
λ ₯ν μ μμ΅λλ€.')
'π¦ λ΄μΌλ°°μμΊ ν > TIL(Today I Learned)' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
TIL_220616_DRF κ°μ (0) | 2023.01.01 |
---|---|
TIL_220615_DRF κ°μ (0) | 2023.01.01 |
TIL_220613_ν νλ‘μ νΈ django (0) | 2023.01.01 |
TIL_220602_ν νλ‘μ νΈ Django (0) | 2023.01.01 |
TIL_220530_Django κΈ°μ΄ (0) | 2023.01.01 |
μμ€ν κ³΅κ° κ°μ¬ν©λλ€