-
base64.encodestring() 메서드의 개행문자로 인한 삽질.....Programming/Python 2012. 5. 14. 19:04
회사 웹 프로젝트중에 python + django로 만들어진 웹 페이지에서
PDF 파일 생성버튼을 클릭하게 되면 django 측에서 데이터를 가공하여
php 스크립트로 정보를 넘겨줘서 xxx.pdf 파일을 생성한뒤
이 pdf 파일을 다운로드 하게 해주는 기능이 있습니다.
php 스크립트로 정보를 던져줄때 python의 subprocess 모듈을 이용하는데
이때 넘겨주는 인자중에 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() 을 사용하는 의미가 뭔가 하는 것입니다. ~_~
이것까지는 아직 파악을 못했는데 저렇게 개행 문자가 들어가는 메서드를
왜 사용하는지 아직 모르겠네요 ~_~
TAG
Encodestring의 경우에 메일 메세지 내에 mime 데이터로 인코딩해서 포함시칼 때 유용하게 사용하고 있습니다.
아 그런쪽에서 사용되는거군요
개행문자가 자동생성되는거라 과연 이게 어떻게 사용되는지 그게 좀 궁금했었거든요 ~_~