[summary]
1.melon-song search
: 아티스트, 앨범, 곡명 검색 분리
2.melon artist search
, add_from_melon
: 아티스트 검색 후, 크롤링을 통해서 artist_id,사진, 이름 그리고 버튼을 누르면 해당 가수의 정보를 DB에 저장
문제
artist_from_melon
크롤링 코드가 이전코드라 수정이 필요함 (아이유만 가능했던 코드였음 ㅋㅋㅋ)
3.artist이미지 저장하는 방법 배움(너무 어려웠다ㅜㅜ 정리할 것)
[과제]
1.song_search , song_add
Melon - song_search
GET 방식
# view
"""
get 방식으로 딕셔너리의 'keyword'값을 받을 경우,
처음엔 빈값이 들어가기 때문에,multiple 관련 오류가 발생
"""
keyword = request.GET['keyword']
# 딕셔너리 인거 어떻게 알지?
print(request.GET)
# get()으로 keyword에 해당하는 value를 받고 keyword가 빈값인지 아닌지 확인
keyword = request.GET.get('keyword')
includeㅋ
- 템플릿 내에 다른 템플릿을 포함할 때 사용
<!-- song_search.html -->
<!-- 템플릿 안에서는 무조건 . 으로 가져와야 한다. -->
<!-- view에서 넘겨준 type이름과 include에서 넘겨주는 type명이 같을
경우 only 를 사용해서 이를 막음 -->
{% for song_info in song_infos %}
{% include 'include/song_search_result.html' with type=song_info.type songs=song_info.songs only %}
{% endfor %}
<!-- song_search_result.html -->
<h3>{{ type }}에 포함</h3>
<ul>
{% for song in songs %}
<li>{{ song.title }}</li>
{% endfor %}
</ul>
named tuple
- 파이썬은 네임드튜플(namedtuple)을 제공하는데 이 네임드튜플을 사용하면 튜플에서 각 위치의 의미를 명시적으로 작성할 수 있다.
- 튜플의 아이템들에 이름을 할당 할 수 있음
# def namedtuple(typename, field_names, verbose=False, rename=False):
# typename = namedtuple의 이름
# field_names = 아이템들에 이름을 붙이는 것
# namedtuple은 주어진 이름과 field로 이루어진 class 반환
# SongInfo라는 namedtuple에 type, p라는 아이템 이름 지정
SongInfo = namedtuple('SongInfo', ['type', 'q'])
# 튜플 아이템에 자료형 지정
class SongInfo(NamedTuple):
type: str
q: Q
# 이런식으로 사용
context = {
'song_infos': [],
}
song_infos = (
SongInfo(
type='아티스트명',
q=Q(album__artists__name__contains=keyword)),
SongInfo(
type='앨범명',
q=Q(album__title__contains=keyword)),
SongInfo(
type='노래제목',
q=Q(title__contains=keyword)),
)
for type, q in song_infos:
context['song_infos'].append({
'type': type,
'songs': Song.objects.filter(q),
})
Melon - artist_search_from_melon
<!-- artist_search_from_melon.html -->
<!-- 해당 가수정보를 DB에 추가할때 버튼을 누르면 post방식으로
'artist-add-from-melon' url에 artist_id가 전달되는 코드 -->
<!-- input type 에 `hidden`을 줘서 값을 전달하는 방법 -->
<form action="{% url 'artist:artist-add-from-melon' %}" method="post">
{% csrf_token %}
<input type='hidden' name="artist_id" value="{{ artist_info.artist_id}}">
<img src="{{ artist_info.img }}" alt="">
<span>{{ artist_info.artist_id }}{{ artist_info.artist }}</span>
<button type="submit">DB에 추가하기</button>
</form>
Melon - artist_add_from_melon
datetime.strptime
- 날짜, 시간형식의 문자열을 datetime으로 만들때 사용한다.
datetime.strptime(birth_date,'%Y.%m.%d')
이런식으로 사용 - from datetime import datetime vs import datetime
# import datetime 의 경우
# datetime의 모든 내용을 가져오지만, 해당 모듈에서 가져온 이름 앞에 datetime을 붙여줘야 한다.
import datetime
now = datetime.datetime.now()
# from datetime import datetime의 경우
from datetime import datetime
now = datetime.now()
이미지 넣는 법
# 그림파일형태의 이미지 가져옴
response = requests.get(url_img_cover)
binary_data = response.content
# BytesIO 파일처럼 취급하는 객체인데, 메모리상에서만
# 아무런 내용이 없는 파일이 메모리에 생성
temp_file = BytesIO()
# 그 파일에 데이터를 입력
temp_file.write(binary_data)
# 파일 탐색 시점 처음으로
# 어떠한 데이터가 입력된 파일 데이터
# 임시 파일이기때문에 이름이 없다.
temp_file.seek(0)
from pathlib import Path
file_name = Path(url_img_cover).name
# 바이트의 위치부터 저장함
artist.img_profile.save(file_name, File(temp_file))
return redirect('artist:artist-list')