Python + Javascript 팁 하나

TL;DR

  • python , jinja2 템플릿, 템플릿내의 javascript 간에 정보를 주고 받을수 있다.

문제

  • BillMaker 개발중에 나온 이슈로 기록해 놓고 싶다.
  • lib_scraping 구현중에 대여한 책 dataframe에서 다음과 같은 정보를 pandas로 뽑아내어 기록했다.
    • 2021week28-01
  • 위 정보는 python에서 뽑아내어 jinja2 템플릿에 전달한 것이므로 일단 html rendering이 완료되면 javascript 처럼 실시간으로 정보가 업데이트 되지 않는다.
  • 그런데 위와 같이 구현한 후에 다음과 같이 개선하고 싶어졌다.
    • 2021week28-02
  • 신규정보인 남은날짜는 정보 특성상 html을 다시 rendering하지 않더라도 html 파일을 열 때마다 업데이트 되어야 하므로 javascript로 구현해야 했다.

구현

  • 다음반납행은 처음 개발한 대로 python + jinja2로만 구현한다.
  • 다음반납행은 h2 태그인데 id=’next_return` attr을 주어 javascript로 추후 수정을 용이하도록 한다.
  • jinja2 템플릿의 제일 마지막에 다음과 같은 script 태그를 추가한다
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    <!-- 다음 반납일과 오늘 사이의 남은 날짜를 계산하여 추가한다-->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment-with-locales.min.js"></script>
    <script>
        moment.locale('ko');
        var elem = document.getElementById('next_return');
        const words = elem.innerHTML.split(' ');
        const return_day = moment(words[1]);
        words.splice(2, 0, `(${moment().to(return_day)})`)
        elem.innerHTML = words.join(' ');
    </script>
    
  • moment.js 불러오는 행은 다음과 같이 두 줄로 해도 된다. 어느게 좋을지는 확인해보지 않았다
    1
    2
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/locale/ko.min.js"></script>
    
  • locale을 적용하지 않은 버전도 있고 나라별로 locale을 분리해놓은 것을 보면 로딩할 때 performance 이슈가 있을 것으로 보인다.
  • locale을 적용해주면 moment().to() 함수를 써서 9일 후를 나타낼 때 한국 표기를 지원해준다. ( 나라별 날짜 계산도 포함)
  • String.split(‘ ‘)를 써서 분리하고 Array.splice()를 써서 필요한 문구를 추가하고 Array.join(‘ ‘)으로 문장을 완성한다.
  • python 에서 javascript로 데이타를 넘길때 javascript가 인식가능한 html의 한 요소로 넘기면 간단하다. ( 보이지 않는 meta 태그에 json 데이타로 넘겨도 된다)

책 표지 관련 기사

사이트에 Javascript의 CodePen 처럼 Python 코드 포스팅하기

Pandas 예제

  • #billmaker, #pandas

문제

  • 아래와 같은 Dataframe 이 있을 때 오늘 (2021-07-03) 기준으로…
    • 이번달 반납일 [18, 22] 과
    • 다음달 반납일 [2, 6] 을 각각 반환하는 함수를 만들고자 한다
index 서명 반납일
0 일번책 2021-07-18
1 이번책 2021-07-22
2 삼번책 2021-07-22
3 사번책 2021-08-02
4 오번책 2021-08-06
  • 이 문제는 Python의 Datetime 라이브러리 만으로 풀려고 하면 복잡하다.
  • Pandas의 Time Series 예제를 충분히 활용해보자

준비 사항

  • 아래와 같이 준비한다

2021week28-03

잘못 해결한 사례

  • 파이썬과 Pandas를 배운 초기에 짰던 코드
  • 다음달을 결정할 때 12월에서 1월로 넘어갈때의 오류등을 없애기 위해
    • python의 내장 라이브러리인 datetime과
    • 3rd 파티 라이브러리인 dateutil까지 사용하고 있다
  • 너무 복잡하다

2021week28-04

좀 더 개선된 사례

  • Pandas에는 자체적으로 Time Series / date functionality 가 있다
  • 웬만한 시간계산 라이브러리 보다 사용하기 좋다
  • 좀 더 개선할 점이 있는지 찾아보자.

2021week28-05