장고(django) 마크다운(markdown) 적용하는 방법

장고(django) 마크다운(markdown) 적용하는 방법

Author : Jino Bae / Send Mail

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

동적으로 변환해주면 매우 간단한데다 편집도 지속적으로 변환해 줄 필요없이 (매우 생상자적 입장에서)편리할 것이다 :)

1
pip install requests models.py

위 패키지를 설치하고 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이라는 라이브러리를 사용한 경험이 있는데 굉장히 만족스러웠다. 깃허브의 문법과 정말 잘 호환된다. 이번에도 그 라이브러리를 사용할 예정이다. 파이썬 코드는 다음과 같이 작성하여 결과를 호출받았다.

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방식으로 보내면 해결 된다는 걸 알지만(GET 방식은 URL에 ?Text=’asdasdasdasd’ 이런식으로 붙으니 길어기면 당연히 뻑난다.) 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로 변경하였다.


Jino Bae
WRITTEN BY

Jino Bae

Digital is a purely human-made playground. That's why I like.
im@baejino.com


comments powered by Disqus