Pylons > Django

Door Sh4wn op maandag 11 oktober 2010 17:32 - Reacties (10)
CategorieŽn: Programming, Webdevelopment, Views: 5.876

Ik heb een tijdje geleden PHP afgezworen voor mijn eigen websites. Ik programmeerde toen al een tijdje Python, en vond Python een dermate betere taal, dat ik dacht, het is vast mogelijk om ook daar websites mee te maken. Zo gezegd, zo gedaan.

Ik ben nu al een aantal websites draaien op Django, maar ben een paar maanden terug toch overgestapt naar Pylons voor mijn toekomstige websites (en heb er alweer behoorlijk wat in ontwikkeling). In deze blogpost vertel ik waarom ik Pylons een stuk beter vind dan Django.
Webdevelopment met Python
Ga je beginnen met webdevelopment in Python, dan kom je niet om Django heen. Django is veruit het populairste python webframework. De documentatie is erg goed, er zijn veel tutorials om je snel op weg te helpen, en voor simpele sites is Django ook heel erg makkelijk. :)

Geen wonder dus dat mijn eerste op Python gebaseerde website met Django gemaakt was. En, mijn site was in notime af. Ik was echt van wajooo Django FTWWWW~~!~! 1337 awesomeee!

Een simpele site heb je met Django dus zo opgezet. Maar goed, daar blijft het dan ook bij. In mijn ervaringen met Django is dat het snel lastiger wordt als je een iets complexere site wilt maken.
Django
Django gebruikt de volgende structuur:
Je hebt een website. Een website is onderverdeeld in 'apps'. BIjvoorbeeld een nieuws app, een reacties app, een wiki app, etc. Het idee hierachter is dat je makkelijk functionaliteit over kan zetten naar andere django websites. Er zijn erg veel third party apps op internet te vinden, die je dan in je eigen website kan stoppen.

Opzich is dat een leuk idee, zo lekker makkelijk delen van websites plug en playen, maar het werkt gewoon net niet. Een website moet 1 mooi geintegreerd geheel zijn, niet allemaal losse modules die houtje touwtje met elkaar samenwerken. Ook als een third party app net niet doet wat jij wil, moet je er zelf weer in gaan hacken, en dat kost allemaal weer tijd. Vaak wil je ook op database niveau een relatie met 1 van de models van de third party app. Dit is uiteraard mogelijk, maar als die app het 'Generic Foreign Key' (Foreign Key naar willekeurig tabel) systeem gebruikt van Django (en dat wordt vrij veel gebruikt), worden aggegrate queries in 1x een stuk lastiger. Een website valt of staat bij de kleine details, en met Django zijn juist die kleine details lastig.

De ORM van Django is ook echt een draak. In de tijd dat Django ontwikkeld werd bestond SQLAlchemy nog niet, dus hebben ze een eigen. En man, als je SQLAlchemy gewend bent, is die van Django enorm beperkt. De simpele queries zijn zeer makkelijk, maar de wat complexere queries worden echt lastig. Je hebt namelijk nauwelijks controle over hoe er gejoined moet worden, aggregates zijn vrij beperkt (en werken niet met het Generic Foreign Key Systeem zoals ik hierboven al aangaf), en het mist gewoon een boel features.

Het is technisch gezien wel mogelijk om een andere ORM te gebruiken, maar dan gaat juist de kracht van Django in rook op: alle bestaande apps hebben namelijk gewoon de standaard ORM nodig van Django.

Ook de debugger is niet het fijnst. 9 van de 10 keer is de TemplateError geen fout in de template, maar gewoon een random andere fout elders in je code, die dan toevallig pas in je template wordt opgemerkt. De foutberichten zijn vaak onduidelijk, en omdat 9 van de 10 keer een TemplateError een andere fout is, heb je ook een verkeerde stacktrace.
Pylons
In tegenstelling tot Django is Pylons heel flexibel opgezet. Waar Django eigenlijk alles inhouse ontwikkelt (ORM, template engine, caching, etc), gaat Pylons niet het wiel opnieuw uitvinden en houdt zich vooral bezig met het integreren van bestaande python modules.

De 'routes' module is bijvoorbeeld geen onderdeel van Pylons, maar staat er gewoon los van. In principe zou je 'routes' ook zonder Pylons kunnen gebruiken. En Pylons kan ook prima zonder de 'routes' module, maar dan moet je zelf een manier bedenken hoe je URL's aan controllers gaat mappen.

Zo zijn er nog een aantal die geen onderdeel van Pylons zijn, maar pylons heeft ze wel nodig. Voorbeelden zijn de template engine (Mako, Genshi of Jinja2), Beaker (sessie en caching framework), en de database backend (SQLAlchemy, SQLObject of CouchDB). Hier zie je ook de kracht van Pylons: de enorme flexibiliteit.

Het is best wel vergelijkbaar met het Zend Framework, aangezien dat ook uit allemaal losse modules bestaat, en dat tot 1 geheel wordt gevormd. Het verschil is dat Pylons niet door 1 team wordt gemaakt (al worden Beaker en Routes wel vooral door Pylons developers onderhouden).

Ik gebruik de combinatie Jinja2, SQLAlchemy en Pylons. Jinja2 is een prachtige template engine met een syntax die veel lijkt op die van Django. De syntax is alleen iets consistenter met python zelf, en heeft een boel meer features en werkt intern ook een stuk beter. SQLAlchemy is een database toolkit inclusief ORM waar je U tegen zegt. Je hebt zoveel controle over wat je selecteert en hoe, je kan elke complexe query relatief eenvoudig uitvoeren met SQLAlchemy. Ook is de SQL die hij uitpoept goed geoptimaliseerd. Alleen deze 2 dingen zijn al zoveel beter dan de ingebouwde template engine en ORM van Django dat ik het overstappen al waard vind.

Je bent met pylons wellicht iets meer code zelf aan het schrijven (omdat je niet van die third party apps hebt), maar je maakt het wel zoals jij het wil, inclusief alle puntjes op de i. En al die kleine details erin verwerken gaat in Pylons gewoon een stuk makkelijker.

Oja, de debugger van Pylons is echt legendary. Ten eerste krijg je gewoon de fout die echt optrad in plaats van een vage TemplateError zoals in django, ten tweede heb je een complete python shell tot je beschikking, kan je lokale variablen zien en aanpassen, source van dat bestand direct bekijken, en met 1 druk op een knop zoeken in de mailinglijsten van Python, SQLAlchemy en/of Pylons. Nog nooit was een fout opsporen zo makkelijk.

Er is wel 1 nadeel, en dat is de documentatie. Omdat het allemaal losse modules zijn is de documentatie op allemaal verschillende plekken te vinden. Je hebt wel een Pylons Boek, wel iets verouderd maar helpt je enorm opweg binnen Pylons, en de documentatie op de officiele Pylons site is ook redelijk, maar kan nog lang niet tippen aan de documentatie van Django. Je zal in het begin nog wel veel dingen aan het uitzoeken zijn.
Wrapup
Django is best leuk voor simpele sites. Je hebt dan ook echt heel snel een site up and running. Maar goed, je bent meestal niet het langst bezig met het ontwikkelen van een site, maar vooral met het onderhouden van de site, en eventueel nieuwe features. En dan kom je wel snel de grenzen van Django tegen. Voor lichtelijke complexere dingen wordt het in Django al snel behoorlijk complex om het goed in je site te verwerken. Wat mij betreft willen ze ook teveel inhouse ontwikkelen waardoor ze nergens echt goed op kunnen focussen.

Pylons is wat dat betreft een stuk beter, het is zo lekker flexibel dat je zelf kan bepalen welke modules je verder gebruikt, en ondanks je zelf iets meer code moet schrijven, weet je wel zeker dat jij de meester bent, en dat het werkt zoals jij het wil, hoe complex je het ook bedenkt. Enige wat ik mis in Pylons is de prachtige admin interface van Django, maar daar heb je in mindere mate FormAlchemy voor, die ook een mini admin paneeltje maakt.

Tot zover mijn eerste blogpost, hope you liked it. :)

Links
Django - http://djangoproject.com
Pylons - http://pylonshq.com
-- Routes module - http://routes.groovie.org/
-- Beaker - http://beaker.groovie.org/
-- Webhelpers - http://pylonshq.com/docs/en/0.9.7/thirdparty/webhelpers
- SQLAlchemy - http://sqlalchemy.org
- Jinja2 - http://jinja.pocoo.org/2/documentation/
- FormAlchemy - http://formalchemy.org

Volgende: Halverwege Google Summer of Code 07-'11 Halverwege Google Summer of Code

Reacties


Door Tweakers user afraca, maandag 11 oktober 2010 18:09

Kijk, prachtige opening post :)

Ik ben zelf wat hobbymatig aan het knutselen met php frameworks, en heel af en toe probeer ik voorzichtig wat Python (m'n projecteuler.net oplossing porten naar Python). Ik had al eerder van de beetje gebrekkige ORM van Django gehoord, en wat andere kleine issues die ik me niet meer herinner, maar dit is een leuk moment om eens met Pylons kennis te maken.

(Komisch eigenlijk dat je nergens een linkje hebt naar Django & Pylons, maar ik dťnk dat ik dat wel ga vinden ;) )

Door Tweakers user Ešrendil, maandag 11 oktober 2010 18:21

Mooie eerste blog inderdaad!

Ik heb ook wel eens naar Django gekeken, maar nog niet echt toegepast omdat de sites waar ik aan werk nog te veel huidige code in PHP hebben.

Hoe doe je het met de hosting van Python sites? Zijn er betaalbare shared webhosters waar je Python sites kan draaien? Of ben je aangewezen op een eigen of virtuele server?

Heb je aanraders voor tutorials of boeken die de basis van Pylons uitleggen en je wegwijs maken in de verschillende modules?

[Reactie gewijzigd op maandag 11 oktober 2010 18:23]


Door Tweakers user Sh4wn, maandag 11 oktober 2010 18:29

Hosten van python websites doe ik inderdaad op mijn VPS, blijft het makkelijkst, en het aanbod wordt tegenwoordig steeds groter en goedkoper.

Er is een Pylons book, http://pylonsbook.com , die je een behoorlijk eind opweg kan helpen, maar op dit moment wel lichtelijk verouderd is (geschreven voor 0.9.7 en 1.0 is huidige versie). Er zijn een aantal API changes, maar je krijgt wel een goed idee hoe pylons werkt.

Ook gebruikt dat boek Mako als template engine, terwijl ik Jinja2 fijner vind, al is het verschil in werking icm met Pylons nihil.

En bedankt voor de leuke reacties :)

Door Tweakers user Kwastie, maandag 11 oktober 2010 19:06

Zelf was ik ook PHP-minded, maar wil het volgende project ook gaan doen in een Python framework (al wel wat kleine dingen gedaan in Django).Ik ben namelijk PHP een beetje zat :Y) .

Zal Pylons ook eens beter bekijken. :P

Door Tweakers user mzziol, maandag 11 oktober 2010 19:10

Helemaal mee eens. Ik ben echter wel van formalchemy overgestapt op Django Forms. De documentatie van FormAlchemy is om te janken en ook de flexibiliteit ben ik niet over te spreken..

Anyway, hier een gelukkige Pylons, Routes, custom ORM, Mako en Django Forms gebruiker. Heerlijk al die losse modules :)

Door Tweakers user i-chat, maandag 11 oktober 2010 19:19

maar is een nadeel van python en de frameworks niet dat je nu dus vast zit aan een zeeer beperkt aantal webhosts.

ik ken eerlijk gezegd niet zo heel veel webhosts maar volgens mij ondersteund geen ervan direct python (maar ik kan het mis hebben?? )

Door Tweakers user mcdronkz, maandag 11 oktober 2010 19:52

Kijk voor de grap eens naar WebFaction als je Python-hosting zoekt :).

Door Tweakers user truegrit, maandag 11 oktober 2010 20:16

Heb zelf ook wel eens gespeeld met python voor websites, maar SQLAlchemy liet me na 3 queries al in de steek. Daarnaast prefereer ik toch vaker de rauwe SQL, misschien iets meer werk maar ook veel meer controle.

Jinja2 vind ik dan wel prachtig, die syntax is zo veel beter dan die van het verbose JSP.

Verder heb ik geen ervaring met pylons, wel met Web.py, wat mij persoonlijk best aanspreekt omdat het zo simpel te gebruiken is. Ik zal toch eens naar pylons moeten gaan kijken voor hobbyprojecten en eventueel de website van mijn werk om te gaan zetten.

Edit: net eventjes geprobeerd, binnen 2 minuten een werkend pylons project + werkende hello world pagina! Dit ga ik eens even verder uitproberen

[Reactie gewijzigd op maandag 11 oktober 2010 20:39]


Door Tweakers user Sh4wn, maandag 11 oktober 2010 21:18

Documentatie van FormAlchemy is niet veel soeps nee, al heb ik de source een beetje doorgekeken, en die admin generator is toch wel handig voor de simpele CRUD pagina's :)

Qua hosting is webfaction idd een leuke, al heb je voor 7 euro/maand al een VPS bij http://directvps.nl/

Dus een virtuele server die je helemaal naar wens kan inrichten, waar je ook nog meerdere sites op kan hosten voor 7 euro in de maand is niet veel :) Tevens kan je nog leuke IRC bot ofzo opzetten als je dat toevallig hebt xD

Door Tweakers user sys64738, woensdag 13 oktober 2010 08:23

Mooie post met inderdaad een herkenbaar probleem: sommige frameworks zien er op het eerste oog heel mooi uit en heb je binnen no time een leuke app in de lucht. Maar... als het dan lastiger wordt, komen toch de rotte plekken naar boven. In de java wereld heb je ook een paar van dit soort frameworks.

Reageren is niet meer mogelijk