• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

[View 함수를 통한 요청 처리] 챕터 아카이브 관련 질문 있습니.

24.04.05 16:44 작성 24.04.05 17:00 수정 조회수 109

0

FireShot Capture 130 - NoReverseMatch at _hottrack_archives_2014_2_12_ - 127.0.0.1.pngFireShot Capture 131 - NoReverseMatch at _hottrack_archives_2023_9_8_ - 127.0.0.1.png

FireShot Capture 132 - course-django-complete-guide-v3_mydjango04_hottrack_templates_hottrac_ - github.com.png

<div>
            <h3>Nav</h3>
            <div class="alert alert-info">
                지난/다음 달 context data를 지원
            </div>
            <div class="btn-group d-flex w-100">
                {% if previous_month.year and previous_month.month %}
                <a href="{% url 'hottrack:song_archive_month' previous_month.year previous_month.month %}"
                   class="btn btn-primary">
                    지난 달
                </a>
                {% endif %}
                {% if next_month.year and next_month.month %}
                <a href="{% url 'hottrack:song_archive_month' next_month.year next_month.month %}"
                   class="btn btn-primary">
                    다음 달
                </a>
                {% endif %}
            </div>
        </div>


2014-02 , 2023-09 release_date의 최소, 최대 구간에서 조회시 에러가 납니다. 깃허브 및 강의 내용 확인 결과 처리하는 부분이 반영이 안되어있는거 같습니다.


FireShot Capture 133 - Page not found at _hottrack_archives_2020_week_35_ - 127.0.0.1.png
/hottrack/archives/2020/week/35/

2020년 35주, 2020년 23주, 2020년 14주, 2019년 39주, 2014년 7주
다른 부분은 정상 작동 되지만 해당 부분에서 에러가 납니다.

2020의 35주는 8월24일, 2014년 7주는 2월10일 부터인데 데이터 베이스에서 조회 할때는 확인 됩니다.

매번 장고 프로젝트를 생성하고 환경설정 하는게 번거로워서 미리 초기 세팅을 해놓은 프로젝트에 깃허브 저장소에서 mydjango03-hottrack에서 hottrack 앱을 복사하였고 [View 함수를 통한 요청 처리]의 내용을 그대로 따라 진행했습니다.

git clone으로 저장소에서 mydjango04를 받고 테스트 해보려 했었는데 env 파일이 없어서 에러가 나기에 테스트를 못해봐서 왜 저 부분에서만 에러가 나는것인지 궁금해서 질문드립니다.

버전 호환성에 따라 문제가 될 수 도 있을거 같아서 제가 설정한 초기 세팅 부분은 혹시 모르니 첨부 해놓았습니다.

Pipfile

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
django = "*"
djangorestframework = "*"
djangorestframework-simplejwt = "*"
django-filter = "*"
django-extensions = "*"
django-environ = "*"
django-cors-headers = "*"
django-template-partials = "*"
django-htmx = "*"
psycopg2-binary = "*"
pillow = "*"
markdown = "*"
ipython = "*"
black = "*"
requests="2.31.0"
pandas = "2.1.3"
django-bootstrap5 = "*"

[dev-packages]
pytest-django = "*"
django-debug-toolbar = "*"
httpie = "*"

[requires]
python_version = "3.12"

Env

# 암호키
SECRET_KEY=django-insecure-sf($0b=0xjgkzmsyu%*bn6cx9$_b%*rz=%$whp8(-^_q+

# 데이터 베이스
DATABASE_ENGINE=django.db.backends.postgresql
DATABASE_HOST=localhost
DATABASE_PORT=5432
DATABASE_NAME=mydb4
DATABASE_USER=myuser4
DATABASE_PASSWORD=mypw4

# 코어스
ALLOWED_HOSTS=localhost,127.0.0.1
CORS_ALLOWED_ORIGINS=http://127.0.0.1:3000,http://localhost:3000
CORS_ALLOW_CREDENTIALS=True

# 타임존
LANGUAGE_CODE=ko-kr
TIME_ZONE=Asia/Seoul
USE_TZ=False

# 디버그
DEBUG=True
INTERNAL_IPS=127.0.0.1




답변 1

답변을 작성해보세요.

0

안녕하세요.

hottrack/song_archive_day.html 템플릿에서 previous_month 값과 next_month 값에 대한 None 체크하는 코드가 누락된 것이 맞습니다. 제보해주셔서 감사드립니다.

코드는 {% if previous_month.year and previous_month.month %} 로 쓰시기보다 {% if previous_month %} 로 쓰시면 충분합니다.

장고 템플릿에서는 변수가 존재하지 않거나 없는 속성에 접근할 경우 빈 문자열을 반환합니다. previous_month 값이 None인데 previous_month.year 이 빈 문자열을 반환하는 것이 이 이유입니다. 장고 템플릿의 string_if_invalid 설정이 빈 문자열입니다.

https://github.com/pyhub-kr/course-django-complete-guide-v3/commit/ee94267969736ff89108ac57f789b348797ba28d

--

/hottrack/archives/2020/week/35/ 주소로 요청이 들어가면, 아래 조회 조건으로 Song 을 조회하게 됩니다.

{'release_date__gte': datetime.date(2020, 8, 31), 'release_date__lt': datetime.date(2020, 9, 7)}

그런데, 위 조건의 Song 레코드가 없기에 404 오류가 발생하는 상황입니다.

이는 WeekArchiveView의 allow_empty 디폴트 설정이 False 이라서 그렇구요.

조회된 레코드가 없는 상황에서 404 응답없이 200 응답을 하실려면

allow_empty 설정을 True로 설정하시면, 빈 레코드의 200 응답을 받으실 수 있습니다.

--

살펴보시고 댓글 부탁드립니다.

화이팅입니다~! ;-)

yezi9733님의 프로필

yezi9733

질문자

2024.04.05

SELECT "hottrack_song"."id",
       "hottrack_song"."melon_uid",
       "hottrack_song"."slug",
       "hottrack_song"."rank",
       "hottrack_song"."album_name",
       "hottrack_song"."name",
       "hottrack_song"."artist_name",
       "hottrack_song"."cover_url",
       "hottrack_song"."lyrics",
       "hottrack_song"."genre",
       "hottrack_song"."release_date",
       "hottrack_song"."like_count"
  FROM "hottrack_song"
 WHERE ("hottrack_song"."release_date" >= '2020-08-31'::date AND "hottrack_song"."release_date" < '2020-09-07'::date AND "hottrack_song"."release_date" <= '2024-04-05'::date)
 ORDER BY "hottrack_song"."release_date" DESC


빠른답변 감사드립니다.
/hottrack/archives/2020/week/35/으로 접속시 해당 쿼리 결과를 반환하네요.


그런데 2020년의 35주차가 2020-08-24 ~ 2020-08-30이 아니라 왜 2020-08-31 ~ 2024-09-06으로 조회되는건가요??

image


image
/hottrack/archives/2020/week/34/로 접속시 2020년 35주의 결과가 반환됩니다.
2020년의 35주는 2020년 8월 24일 ~ 2020년 8월 30일 까지 이므로 쿼리의 계산 결과가 맞습니다.
다만 /hottrack/archives/2020/week/35/로 접속시 해당 결과가 처리되는게 아니라는게 문제입니다.


imageimage

/hottrack/archives/2022/week/51/로 접속시 2022년 51주의 결과가 반환됩니다.
2022년의 51주는 2022년 12월 19일 ~ 2022년 12월 25일 까지 이므로 쿼리의 계산 결과가 맞습니다.

대한민국 표준시를 기준으로 하고 있고 USE_TZ=False으로 설정해서 로컬 시간으로 잡아놓은게 연관이 있으려나요?

살펴보니, 장고 내에서 주차를 계산할 때, 파이썬의 datetime.strptime의 %U 지시자를 통해서 주차를 지정하는 데요.

https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior

위 공식문서를 보시면 %U 지시자의 값이 0 부터 시작합니다. 즉 0 주차부터 있는 거죠.

image

그러니 /hottrack/archives/2020/week/35/ 요청의 경우, 우리가 36주차로 아는 날짜로 처리하고 있었던 것입니다.

WeekArchiveView에서는 get_week 메서드를 통해 요청의 주차 인자를 가져오니깐요. get_week 메서드를 재정의해서 1을 빼주는 것으로 처리를 해보실 수도 있으실 듯 합니다. :-)

image

yezi9733님의 프로필

yezi9733

질문자

2024.04.05

말씀하신대로 해당 코드를 적용하니 2020년 35주, 2020년 23주, 2020년 14주, 2019년 39주, 2014년 7주 차에 접속했을 때 정상적으로 처리가 되어지지만 이제 다른 주차에서 문제가 되어버리네요 ㅜ 만약 해당 부분을 제대로 처리하려면 별도로 로직을 적용시켜야 하는건가 보군요.

덕분에 왜 에러가 발생하게 되는지 알게되었습니다. 살펴 봐주셔서 감사합니다.