오늘 개발한 내용들 중 다시 쓸만한 것이나 참조할때 쓸만한 것들을 대충 정리했다.
Tag
Show Debug Data
from django.conf import settings from django import template register = template.Library() @register.simple_tag def show_debug_data(): return settings.DEBUG and settings.SHOW_DEBUG_DATA
기존에는
debug
로 했는데 잠시 외부 도움을 받을려고 Try Cloudflare
서비스를 이용했는데, 그대로 디버그 데이터가 노출되어 버린것이다. 이유는 Reverse Proxy 이기 때문에 Internal IP가 같아서 생긴 내용. 일단은 이렇게 하고 settings.py
에 SHOW_DEBUG_DATA = False
라인을 추가했다. 외부에서 도움을 받을때만 끄면 되니까.Filter
render_image_tag
from django import template import re register = template.Library() @register.filter def render_image_tag(value, _args = ""): if '|' in _args and '=' in _args: args = {k: v for k, v in [i.split('=') for i in _args.split('|')]} else: args = {'src': _args} additional = [] src = args.get('src', '') inline_style = args.get('style', None) inline_class = args.get('class', None) print(args) match src: case '[static]': path = '/static/' case _: path = src if inline_class: additional.append(f'class="{inline_class}"') if inline_style: additional.append(f'style="{inline_style}"') return re.sub(r"\[image\s+[\"'](.+?)[\"']\]", fr'<img src="{path}\1" {" ".join(additional)} />', value)
[image 'text.jpg']
식으로 사용한다.이미지를 글 중간에 표시해야했다. 그런데 아뿔사! 이미지 관련 필드를 넣지못했다! 임시로 정규식을 사용하여 해결을 봤다.
{% with text=post.description|render_image_tag:'src=[static]|style=width:100%;'|safe %}
사실 완벽한 방법이 아니기도 하고, 여러 이슈가 있다. 그래도 없는것 보단 낫다. 다음에는 못해도 마크다운을 쓰도록 설계해야겠다.
splitter
from django import template register = template.Library() @register.filter def splitter(value, _arg): match _arg: case '[newline]': arg = '\n' case _: arg = ' ' l = value.split(arg) return [i.strip() for i in l]
이것도 임시다.
split
을 하여 새로운 라인을 만들때 필요했다. 일반적인 TextField
를 사용했기에 발생했다. 새로운 라인이 깨졌기에 각각 나눠서 탬플릿 내에서 for
문을 돌릴때 사용했다. 심지어 '\n'
으로 넘길시에 작동이 제대로 안되어 추가적으로 match-case
문을 만들어 넣었다.다음부터는 마크다운으로 렌더링 해야겠다는 생각만 들었다.
{% for line in post.description|render_image_tag:'[static]'|spliter:'[newline]' %} <p style="margin-top: 10px; text-align: left;">{{ line|safe }}</p> {% endfor %}
시간이 부족하면, 땜빵을 하고, 이게 10년을 간다. 조심해야겠다.