ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • base64.encodestring() 메서드의 개행문자로 인한 삽질.....
    Programming/Python 2012.05.14 19:04

    회사 웹 프로젝트중에 python + django로 만들어진 웹 페이지에서

    PDF 파일 생성버튼을 클릭하게 되면 django 측에서 데이터를 가공하여

    php 스크립트로 정보를 넘겨줘서 xxx.pdf 파일을 생성한뒤 

    pdf 파일을 다운로드 하게 해주는 기능이 있습니다.


    php 스크립트로 정보를 던져줄때 pythonsubprocess 모듈을 이용하는데

    이때 넘겨주는 인자중에 base64.encodestring() 을 통해 넘겨주는 인자가 있습니다.


    사소한 오류가 발생해서 수정하고나서 저 pdf 생성 버튼을 클릭했더니만

    pdf파일이 생성이 안되어서 django 오류가 나버리는 현상이 발생했습니다.


    문제가 발생할만한 부분에서 log를 찍어보니 base64 인코딩된 문자열에

    개행이 발생하는걸 발견하게 되었습니다.


    base64 모듈의 encodestring() 의 API문서를 확인해보니 

    Encode the string s, which can contain arbitrary binary data, and return a string containing one or more lines of base64-encoded data. 

    encodestring() returns a string containing one or more lines of base64-encoded data always including an extra trailing newline ('\n').


    다음과 같은 내용으로 되어있었습니다.

    그래서 몇가지 테스트를 해보았습니다.


    $ python

    >>> base64.encodestring('환상경')

    '7ZmY7IOB6rK9\n'


    테스트 결과 마지막에 '\n'이 추가된걸 확인할 수 있었습니다.

    그냥 이렇게 문자열 마지막에 개행문자가 추가되는거면 문제가 없는데


    >>> base64.encodestring('아이유의 좋은날 --  나는요 오빠가 좋은걸 어떡해')

    '7JWE7J207Jyg7J2YIOyii+ydgOuCoCAtLSAg64KY64qU7JqUIOyYpOu5oOqwgCDsoovsnYDqsbgg\n7Ja065ah

    7ZW0\n'


    와 같이 길이가 길어지게되면 중간에 개행문자를 삽입한뒤 그 뒤에 다시 나머지 문자열을 생성하게 됩니다.


    바로 이 문제때문에 django에서 인자를 총 4개를 전달하는데 저 개행문자로 인해 5개가 전달이 되어버려 

    php 스크립트에서 4번째 인자를 잘못 받아들여 문제가 생겼던 것입니다.


    이 문제를 해결하려면 base64 모듈의 다른 메서드를 사용하면 됩니다.

    저는 b64encode() 라는 메서드를 이용해서 해결 했습니다.


    >>> base64.b64encode('아이유의 좋은날 --  나는요 오빠가 좋은걸 어떡해')

    '7JWE7J207Jyg7J2YIOyii+ydgOuCoCAtLSAg64KY64qU7JqUIOyYpOu5oOqwgCDsoovsnYDqsbgg7Ja065ah

    7ZW0'


    테스트 코드를 보시면 개행문자 없이 출력된것을 확인할수 있을것입니다.

    일단 문제는 저런 방식을 통해 해결을 했지만 여기서 생각해볼것이

    과연 encodestring() 을 사용하는 의미가 뭔가 하는 것입니다. ~_~

    이것까지는 아직 파악을 못했는데 저렇게 개행 문자가 들어가는 메서드를

    왜 사용하는지 아직 모르겠네요 ~_~

    댓글 2

    • 스파이크 2012.05.17 11:39

      Encodestring의 경우에 메일 메세지 내에 mime 데이터로 인코딩해서 포함시칼 때 유용하게 사용하고 있습니다.

      • BlogIcon 환상경 2012.05.19 13:09 신고

        아 그런쪽에서 사용되는거군요
        개행문자가 자동생성되는거라 과연 이게 어떻게 사용되는지 그게 좀 궁금했었거든요 ~_~

Designed by Tistory.