Subir archivos con Django: Dango-tinymce y django-filebrowser

Django-TinyMCE + Django-Filebrowser


Me váis a permitir una pequeña nota mental porque siempre me hago un lío. A la hora de usar un editor WYSIWYG en Django normalmente las preguntas suelen ser las mismas de siempre:

  1. ¿TinyMCE ó CKEditor?.
  2. ¿Django Filebrowser con Grappelli o sin Grappelli?
  3. ¿Funcionará en Django 1.4?
  4. ¿Vienen integrados con uploaders de imágenes?.
  5. ¿Funciona automágicamente con el admin de Django?.
  6. ¡Truenos!, no me funciona a la primera, ¿por qué?.

Las respuestas son sencillas una vez se ha probado… y como es la segunda vez que tropiezo con la misma piedra casi prefiero dejarlo documentado para torpes como yo.

¿TinyMCE ó CKEditor?

Yo actualmente estoy usando TinyMCE con el paquete django-tinymce (django-tinymce==1.5.1b2) porque funciona bien en conjunción con django-filebrowser-no-grappelli (django-filebrowser-no-grappelli==3.0) y es muy sencillo de utilizar (link, link).

¿Django Filebrowser con Grappelli o sin Grappelli?

Queda respondida con la anterior, en principio utilizo la versión “no-grappelli” porque quiero tener las dependencias mínimas para que los proyectos funcionen de forma autónoma. Todavía no he probado Grappelli en profundidad, estoy convencido que el día que lo haga me gustará, pero mientras tanto me voy apañando (algo he leido sobre incompatibiliades de esta modificación con Django 1.4).

¿Funcionará en Django 1.4?

Puedo asegurar que django-tinymce + django-filebrowser-no-grappelli es fully functional en Django 1.4. Upload con uploadify y select combinado con tinymce incluidos. El mayor problema que nos podremos encontrar es la ubicación de los .js.

¿Vienen integrados con uploaders de imágenes?

Si, django-filebrowser-no-grappelli viene con un upload genérico (en caso de no tener Flash) y Uploadify en caso de disponer del plugin de Adobe. Por si a alguien le interesa, también hay un paquete llamado django-filebrowser-no-grappelli-and-uploadify (un fork del anterior sin Uploadify para los que odian Flash).

¿Funciona automágicamente con el admin de Django?

Si, sin duda. Siguiendo las instrucciones indicadas, django-tinymce es capaz de renderizar todos los campos de tipo TextField() con su WYSIWYG correspondiente para que puedas hacer de la edición de texto una tarea más sencilla.

¡Truenos!, no me funciona a la primera, ¿por qué?

Depende, yo las dos veces que tropecé fueron básicamente por lo mismo: los archivos javascript no estaban colocados en la ubicación correcta. Me había hecho un lío entre /media/ y /admin/media/ y no se habían cargado varios archivos necesarios para el correcto funcionamiento. Los .js estaban situados correctamente pero llaman a otros .js que estaban huérfanos. ¡Usa un Firebug o similar!.

No te creo

Tampoco lo pretendía, lo único que puedo hacer es presentar un pantallazo justificando toda esta parrafada que acabo de escribir:


Instalar PIL en VirtualEnv – Django

1. Install the dependencies needed for the PIL library, using aptitude. This installs everything but PIL itself.

sudo apt-get build-dep python-imaging


2. Install the python-dev package so that we can compile PIL.

sudo apt-get install python-dev


3. Make sure that PIL’s can find JPEG/ZLIB, by creating find-able links to the libraries. Ubuntu installs these libs in a non-standard place, so the package installer needs a little help finding them.

sudo ln -s /usr/lib/x86_64-linux-gnu/ /usr/lib/

sudo ln -s /usr/lib/x86_64-linux-gnu/ /usr/lib/

sudo ln -s /usr/lib/x86_64-linux-gnu/ /usr/lib/


*note* These links are for a 64-bit Ubuntu. For 32-bit installations, I believe it should be replaced by i386-linux-gnu


4. From the root of your virtualenv (with it activated) run:

pip install PIL

7 librerias importantes de python

7 Python Libraries you should know about

In my years of programming in Python and roaming around GitHub’s Explore section, I’ve come across a few libraries that stood out to me as being particularly enjoyable to use. This blog post is an effort to further disseminate that knowledge.

Please note that I’ve specifically excluded libraries like sqlalchemy and Flask that are too obviously awesome to make the list.

1. pyquery (with lxml)


For parsing HTML in Python, Beautiful Soup is oft recommended and it does a great job. It sports a good pythonic API and it’s easy to find introductory guides on the web. All is good in parsing-land .. until you want to parse more than a dozen documents at a time and immediately run head-first into performance problems. It’s – simply put – very, very slow.

Just how slow? Check out this chart from the excellent Python HTML Parser comparison Ian Bicking compiled in 2008: immediately stands out is how fast lxml is. Compared to Beautiful Soup, the lxml docs are pretty sparse and that’s what originally kept me from adopting this mustang of a parsing library. lxml is pretty clunky to use. Yeah you can learn and use Xpath or cssselect to select specific elements out of the tree and it becomes kind of tolerable. But once you’ve selected the elements that you actually want to get, you have to navigate the labyrinth of attributes lxml exposes, some containing the bits you want to get at, but the vast majority just returning None. This becomes easier after a couple dozen uses but it remains unintuitive.

So either slow and easy to use or fast and hard to use, right?


Enter PyQyery

Oh PyQuery you beautiful seductress:

from pyquery import PyQuery
page = PyQuery(some_html)

last_red_anchor = page('#container >')

Easy as pie. It’s ever-beloved jQuery but in Python!

There are some gotchas, like for example that PyQyery, like jQuery, exposes its internals upon iteration, forcing you to re-wrap:

for paragraph in page('#container > p'):
    paragraph = PyQuery(paragraph)
    text = paragraph.text()

That’s a wart the PyQuery creators ported over from jQuery (where they’d fix it if it didn’t break compatability). Understandable but still unfortunate for such a great library.

2. dateutil


Handling dates is a pain. Thank god dateutil exists. I won’t even go near parsing dates without trying dateutil.parser first:

from dateutil.parser import parse

>>> parse('Mon, 11 Jul 2011 10:01:56 +0200 (CEST)')
datetime.datetime(2011, 7, 11, 10, 1, 56, tzinfo=tzlocal())

# fuzzy ignores unknown tokens

>>> s = """Today is 25 of September of 2003, exactly
...        at 10:49:41 with timezone -03:00."""
>>> parse(s, fuzzy=True)
datetime.datetime(2003, 9, 25, 10, 49, 41,
                  tzinfo=tzoffset(None, -10800))

3. fuzzywuzzy


fuzzywuzzy allows you to do fuzzy comparison on wuzzes strings. This has a whole host of use cases and is especially nice when you have to deal with human-generated data.

Consider the following code that uses the Levenshtein distance comparing some user inputto an array of possible choices.

from Levenshtein import distance

countries = ['Canada', 'Antarctica', 'Togo', ...]

def choose_least_distant(element, choices):
    'Return the one element of choices that is most similar to element'
    return min(choices, key=lambda s: distance(element, s))

user_input = 'canaderp'
choose_least_distant(user_input, countries)
>>> 'Canada'

This is all nice and dandy but we can do better. The ocean of 3rd party libs in Python is so vast, that in most cases we can just import something and be on our way:

from fuzzywuzzy import process

process.extractOne("canaderp", countries)
>>> ("Canada", 97)

More has been written about fuzzywuzzu here.

4. watchdog


watchdog is a Python API and shell utilities to monitor file system events. This means you can watch some directory and define a “push-based” system. Watchdog supports all kinds of problems. A solid piece of engineering that does it much better than the 5 or so libraries I tried before finding out about it.

5. sh


sh allows you to call any program as if it were a function:

from sh import git, ls, wc

# checkout master branch

# print(the contents of this directory

# get the longest line of this file
longest_line = wc(__file__, "-L")

6. pattern


This behemoth of a library advertises itself quite modestly:

Pattern is a web mining module for the Python programming language.

… that does Data MiningNatural Language ProcessingMachine Learning and Network Analysis all in one. I myself yet have to play with it but a friend’s verdict was very positive.



When I first learned Python os.path was my least favorite part of the stdlib.

Even something as simple as creating a list of files in a directory turned out to be grating:

import os

some_dir = '/some_dir'
files = []

for f in os.listdir(some_dir):
    files.append(os.path.joinpath(some_dir, f))

That listdir is in os and not os.path is unfortunate and unexpected and one would really hope for more from such a prominent module. And then all this manual fiddling for what really should be as simple as possible.

But with the power of path, handling file paths becomes fun again:

from path import path

some_dir = path('/some_dir')

files = some_dir.files()


Other goodies include:

>>> path('/').owner

>>> path('a/b/c').splitall()
[path(''), 'a', 'b', 'c']

# overriding __div__
>>> path('a') / 'b' / 'c'

>>> path('ab/c').relpathto('ab/d/f')

Best part of it all? path subclasses Python’s str so you can use it completely guilt-free without constantly being forced to cast it to str and worrying about libraries that checkisinstance(s, basestring) (or even worse isinstance(s, str)).


Copiado de:

Instalar MySqldb en Windows


Instaladores de MySQLdb (MySQL para Python) para Windows
Iniciando a programar en Python, me di cuenta de que no existía una forma sencilla de instalar MySQLdb (soporte de MySQL para Python) en Windows. En el sitio oficial se hace referencia a la página de descargas en SourceForge, y en ella tan solo existen archivos con el código fuente del mismo.

Al final, buscando en la Internet encontré como construirlo e instalarlo en el magnífico tutorial de Yun Fu, pero para ello es necesario tener instalado Microsoft Visual C++ 2008 y modificar un par de archivos, tanto en el código de MySQLdb como en un archivo de configuración de Python.

Para aquellos que no tienen tiempo de (o simplemente no quieren) seguir el tutorial y generar los binarios, pueden seguir el siguiente link donde encontrarán las descargas de los instaladores para Windows de 32 y 64 bits, tanto para Python 2.6 como para 2.7.

Página de descarga de instaladores de MySQLdb para Windows

Robado de :

Permisos en OVH

Debe respetar ciertas reglas de seguridad en relación a los derechos que se dan a a los ficheros web y a los scripts (CGI).

- La raíz de su sitio debe estar obligatoriamente en 705 (los permisos establecidos por defecto por OVH).

  • Se trata del directorio / (barra) o . (punto) en su conexión FTP. No lo modifique.

- Los otros directorios deben tener permisos de 705 o bien 755
- Las páginas web deben tener permisos de 604 o bien 644
- Los scripts CGI deben tener permisos de 705 o bien 755

Iframe con TinYMC en Joomla 1.6

Para todos aquellos que se inicien en la nueva versión del gestor de contenidos Joomla 1.6, aquí os muestro un rápido tutorial para comprender porque los Videos de YouTube no se muestran dentro de los artículos de Joomla 1.6. Esto es debido a que en dentro de Joomla 1.6 hay una especial configuración que se llama Filtros de Texto (Text Filters).

¿Qué exactamente hacen los Filtros de Texto? Son filtros que proporcionan más control sobre el contenido HTML que añades a tu página web. Puedes ser tan estricto como quieras conveniente pero por defecto está opción viene activada para evitar ataques contra tu propia página. Evita por tanto que código malicioso pueda ser incrustado sin querer evitando así ataques de hackers. Es una forma de incrementar la seguridad de tu página.

Ahora bien, para poder añadir videos de Youtube a tus artículos tienes que desactivar esta opción, y aquí es donde viene la parte interesante. Mediante estos sencillos pasos podrás hacerlo sin ningún problema. Pero primero, por si alguien no sabe como se hace, enlazo a un video tutorial que muestra How to insert YouTube Videos inside Joomla 1.6 Articles (como insertar videos de youtube en artículos de Joomla 1.6). El artículo continúa en Leer más.

Estos son los pasos para poder mostrar los videos:

1) Logéate dentro de la administración de 1.6
2) Ahora vamos a o to Contenido > Gestor de Artículos

joomla 16 content article manager Joomla 1.6 doesn’t display YouTube videos inside my Articles
3) Hacemos clic en Opciones

joomla 16 content article manager Joomla 1.6 doesn’t display YouTube videos inside my Articles
4) Ahora hacemos click en Filtros de Texto

joomla 16 content article manager Joomla 1.6 doesn’t display YouTube videos inside my Articles
5) Cambiar el tipo de filtro para el Super Usuario a Sin Filtrar – Este cambio permitirá a este usuario poder incrustar videos de Youtube dentro de los artículos de Joomla 1.6. También puedes cambiar los otros grupos si quieres.

joomla 16 content article manager Joomla 1.6 doesn’t display YouTube videos inside my Articles

Por otra banda, también puede ser que el editor que estéis usando en vuestra página web esté evitando también la incrustación de código según varios criterios. Me voy a referir al editor que viene con Joomla, llamado TinyMCE.

editor tinymce

Para el editor TinyMCE tendréis que ir a Extensiones > Gestor de Plugins.

editor tinymce

A continuación buscáis el editor TinyMCE y dentro de la configuración tenéis que fijaros si en Elementos prohibidos viene algo escritor. Por defecto sí. Para los videos de Youtube con borrar “iframe” ya sería suficiente.

editor tinymce


NOTA: Además, acordaros que donde pone “Limpiar código al guardar” tenéis que poner nunca.

Robado de