Alexander A. E. Full Stack Developer

Markdown en django

Como ya sabemos, a partir de la versión 1.5 de django, el módulo contrib.markup esta siendo depreciado. Por ello, si buscamos incluir markdown en nuestro proyecto debemos recurrir a paquetes de terceros o crear nuestro propio "template filter" (si deseamos escapar markdown como html), lo cual no es tan complicado.

Lo primero a necesitar es un paquete que convierta markdown a html. De los dos que probé markdown y markdown2 me quedo por el primero porque incluye algunas opciones como output_format.

Inicialmente nuestro template filter puede lucir más o menos así:

::python
from django import template
from django.template.defaultfilters import stringfilter
from markdown import markdown

register = template.Library()


@register.filter(is_safe=True)
@stringfilter
def mrkdwn(txt):
    return markdown(txt)

La función markdown, entre otros, acepta algunos parámetros como:

  • safe_mode: permite deshabilitar html (a pesar del nombre, no es una garantía de ser un modo seguro)
  • html_replacement_text: texto a mostrar cuando safe_mode toma el valor de replace
  • enable_attributes: controla la conversión de atributos html (desactivado cuando safe_mode vale True)

entre otras

Y si el código markdown será ingresado por usuarios no confiables1, debemos tener en cuenta que podría insertarse código malicioso.

Podríamos mejorar un tanto la primera versión de nuestro filtro:

::python
from django import template
from django.template.defaultfilters import stringfilter
from markdown import markdown

register = template.Library()


@register.filter(is_safe=True)
@stringfilter
def mrkdwn(txt):
    return markdown(txt, safe_mode=True, output_format='html5',
        enable_attributes=False)

Este es el template html con el que hice mis pruebas:

::jinja

{% load my_tags %}

<h1>Test</h1>

{{ 'hola'|mrkdwn }}
<br>
{{ 'áéíóúñ'|mrkdwn }}
<br>
{{ '<b>bold</b>'|mrkdwn }}
<br>
{{ 5|mrkdwn }}
<br>
{{ '**test** <b>otro test</b>'|mrkdwn }}
<br>
{{ '*cursiva<b>bold</b>*'|mrkdwn }}
<br>
{{ '{@onclick=alert("hi")}es en serio?'|mrkdwn }}
<br>

Posiblemente la última versión que utilicé tampoco sea del todo segura, se pueden ver algunas discusiones sobre el tema aquí:

Y como decía Gene Spafford:

El único sistema realmente seguro es aquel que está apagado, confinado en un bloque de hormigón y sellado en una habitación forrada de plomo con guardias armados – y aún así tengo mis dudas.


  1. en un sistema de comentarios por ejemplo 

Comentarios !

comments powered by Disqus