Esta web usa cookies propias y de terceros para mejorar tu experiencia de navegación y realizar tareas de análisis. Al continuar con tu navegación entendemos que das tu consentimiento a nuestra política de cookies.

MY NEW STATIC BLOG. WHY? BECAUSE FUCK YOU, THAT'S WHY!




Si quieres desarrollar una web rápidamente puedes elegir python, un lenguaje de scripting muy sencillo, potente y con una cantidad inmensa de frameworks para lo que quieras.

Para los primero bocetos de kelinux elegí webpy, un framework minúsculo y sencillo. Tan sencillo como esto:
import web
        
urls = (
    '/(.*)', 'hello'
)
app = web.application(urls, globals())

class hello:        
    def GET(self, name):
        if not name: 
            name = 'World'
        return 'Hello, ' + name + '!'

if __name__ == "__main__":
    app.run()

Guardas el archivo como prueba.py, lo ejecutas (python prueba.py) y ya tienes un servidor andando en el puerto 8080. Era justo lo que necesitaba para empezar, pero en cuanto le metes un poco de caña empiezas a encontrar deficiencias: servir archivos estáticos es un poco engorroso, y el acceso a la base de datos es prácticamente manual, las ayudas son muy pocas y por tanto no es idóneo para desarrollo rápido.

Lo único bueno que he encontrado en google app engine es precisamente la facilidad para trabajar con la base de datos (otra cosa son las inmensas limitaciones y la ridícula velocidad). Tan sólo tienes que crear una clase que herede de db.Model y ya tienes una tabla.

¿Y no se puede tener algo así sin necesidad de pasar por google app engine? si, como ya he dicho, python tiene infinidad de frameworks PARA LO QUE QUIERAS, incluido el acceso a bases de datos con mapeo de clases sobre tablas. El framework que he elegido para esto es SQLalchemy, que permite trabajar con numerosos motores de base de datos como SQLite, MySQL, PostgreSQL, Oracle y un largo etcétera. He elegido MySQL con el motor Innodb que tiene un rendimiento genial.

Escribir HTML es un poco tedioso y repetitivo, por eso lo mejor es usar un motor de plantillas que permite "externalizar" o "independizar" la capa de presentación, todo el código HTML se generará aquí. En google app engine se suele usar Django, pero es un framework muy bestia y pesado, yo prefiero algo más ligero, algo que solo sea un motor de plantillas, por ese motivo he elegido Jinja2, por eso y porque la sintaxis el prácticamente la misma que en Django, y es más rápido.

Ya tenemos webpy + sqlalchemy + jinja2, pero teniendo en cuenta que webpy solamente lo quiero como servidor web ¿No sería mejor usar un framework que sea solamente un servidor? si, por eso finalmente elegí cherrypy, que además hace mejor su función, servir páginas. Y permite usar menos código:
import cherrypy
class HelloWorld(object):
    def index(self):
        return "Hello World!"
    index.exposed = True

cherrypy.quickstart(HelloWorld())
Menos código, más legible y más rápido.

Pero no es oro todo lo que reluce, una vez unes todas las piezas (cherrypy + sqlalchemy + mysql + jinja2) te encuentras con el primer enemigo de esta alianza, el UTF-8. ¿Cómo es posible que un servidor web que por defecto usa UTF-8, un framework para bases de datos que por defecto usa UTF-8 y un motor de plantillas que por defecto usa UTF-8 tengan problemas con UTF-8? fácil, la configuración por defecto es defectuosa, o por lo menos en mi caso lo es.

Cherrypy envía los datos al navegador usando el primer juego de caracteres que soporte, y no es el UTF-8, y te devuelve los datos conforme el navegador se los devuelva, y no es en UTF-8 ¿Solución? activar las herramientas de  codificación y decodificación:
cp_config = {
    'global': {
        'tools.encode.on': True,
        'toots.encode.encoding': 'utf-8',
        'tools.decode.on': True
    }

Pienso que deberían venir activadas por defecto, pero vete tú a saber porqué no lo hacen.

Siguiente víctima: SQLalchemy. No importa cuantas veces pongas que quieres los datos en UTF-8, SQLalchemy petará cada vez que intentes leer algo ¿Pero cuál es el problema? el unicode, el formato de string de python, SQLalchemy te devuelve los datos en UTF-8, e lugar de hacerlo en unicode y por eso peta ¿Cómo solucionarlo? con el flag convert_unicode:
Ke_engine = create_engine("mysql://%s:%[email protected]%s:%s/%s" % (MYSQL_USER, MYSQL_PASS, MYSQL_HOST, MYSQL_PORT, MYSQL_DBNAME), encoding='utf-8', convert_unicode=True, echo=APP_DEBUG)
Se acabó el problema.

Con esto solo cubro una pequeña parte de las peripecias que he tenido, pero el artículo ya me está quedando muy largo, así que continuaré en sucesivos artículos ;-)
comments powered by Disqus

Powered by PussyPress.