장고의 포스트 모델이 단일 텍스트 필드라서 새로운 문서 에디터라도 넣어야되나 싶었다. 관련된 내용을 인터넷에서 찾아보니 깃허브에서 텍스트를 마크다운으로 변환해주는 API를 제공해 주는데, 글을 작성한 분께서는 파이썬의 requests 라이브러리를 이용하였다. 텍스트를 주고 HTML을 가져오는 것이다.

동적으로 변환해주면 매우 간단한데다 마크다운으로 저장되어 있으니 변환해 줄 필요없이 사용자가 편리하게 글을 편집할 수 있을 것이다 :)

1
pip install requests

위 패키지를 설치하고 models.py에 다음과 같이 함수를 만들어 준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
from django.db import models
import requests

def DownToUp(text):
    headers = {'Content-Type': 'text/plain'}
    data = text.encode('utf-8')
    res = requests.post('https://api.github.com/markdown/raw', headers=headers, data=data)
    return res.text

class 모델...:
    ...
    def printText(self):
        return DownToUp(self.text)

포스트에서 호출할때는 {{ post.printText | safe }}와 같이 사용하면 된다. 처음에는 잘 동작했는데 몇번 쓰다보면 제한이 결려서 결과를 얻지 못하는 경우가 있다. 방문자 입장에서는 큰 문제가 없겠지만, 디자인을 변경하고 확인하는 내 입장에선 곤란하다. 그래서 비슷한 방식을 사용해서 직접 변환해 주고자 하였다.


PHP - Parsedown

PHPParsedown이라는 라이브러리를 사용한 경험이 있는데 굉장히 만족스러웠다. 깃허브의 문법과 정말 잘 호환된다. 이번에도 그 라이브러리를 사용할 것이다. requests에서 힌트를 얻었듯이 말이다. 파이썬 코드는 다음과 같이 작성하여 결과를 호출받았다. Parsedown Link

1
2
3
4
5
6
7
8
9
10
11
12
import requests

text="""
# Test

TestTestTestTestTestTestTest
"""

params = {'Text': text.encode('utf-8')}
res = requests.get('URL', params=params)

print(res.text)

테스트하기 위해서 만들어진 코드이며 아주 만족스러운 결과를 얻을 수 있었다. 깃허브에서 오는것보다 속도도 훨 빠르다. PHP 코드는 다음과 같이 작성했다.

1
2
3
4
5
6
7
8
9
<?php
    include "./parsedown.php";
    
    $Text = $_GET['Text'];
    $Parsedown = new Parsedown();
    $ParseText = $Parsedown->text($Text);
    
    echo $ParseText;
?>

정말 별거 없는 코드다. Nginx를 사용했는데 414 request-uri too large 에러가 발생하였다. Nginx에 다음과 같은 옵션을 추가해서 해결하였다.

1
large_client_header_buffers 4 32k;


내용 추가

위 옵션을 추가해서 해결했다곤 했지만 긴 문구를 변환하려니 다시 414 에러가 발생했다. POST방식으로 보내면 해결 된다는 걸 알지만 POST 방식으로 Python에서 어떻게 보내봐도 빈 값으로 응답이 돌아왔다. 결국 해결했다. 정말 긴이이이인 문장도 안심하고 응답받을 수 있게 되었다.

1
2
3
4
5
6
7
8
9
10
11
12
import requests

text="""
# Test

TestTestTestTestTestTestTest
"""

data = {'Text': text.encode('utf-8')}
res = requests.post('URL', data=data)

print(res.text)

post 메서드를 호출할때는 params가 아닌 data로 보내주어야 정상적으로 응답이 온다. PHP에서는 _GET_POST로 변경하였다.

1
2
3
4
def parsedown(text):
    data = {'Text': text.encode('utf-8')}
    res = requests.post('https://api.baejino.com/markdown/get.php', data=data)
    return res.text

테스트가 아닌 완성된 코드는 위와같다. api.baejino.com 부분을 자신의 서버로 변경하면 된다 :)

WRITTEN BY

배진오

소비적인 일보단 생산적인 일을 추구하며, 좋아하는 일을 잘하고 싶어합니다 :D
im@baejino.com