summaryrefslogtreecommitdiff
path: root/pypers/yet-another-comparison-of-web-frameworks.txt
diff options
context:
space:
mode:
Diffstat (limited to 'pypers/yet-another-comparison-of-web-frameworks.txt')
-rw-r--r--pypers/yet-another-comparison-of-web-frameworks.txt292
1 files changed, 292 insertions, 0 deletions
diff --git a/pypers/yet-another-comparison-of-web-frameworks.txt b/pypers/yet-another-comparison-of-web-frameworks.txt
new file mode 100644
index 0000000..6badf1d
--- /dev/null
+++ b/pypers/yet-another-comparison-of-web-frameworks.txt
@@ -0,0 +1,292 @@
+Yet Another Comparison of Python Web Frameworks
+=======================================================================
+
+:author: Michele Simionato
+:date: October 2007
+
+.. contents::
+
+You can find on the Net hundreds of reviews/comparisons of
+Python Web Frameworks, yet they are never enough, since new
+frameworks continue to appear every day and old frameworks
+continue to change at an even faster rate. At work we are now shopping
+for a new Web framework, so I am looking at the available options
+and I have decided to write this document which may be of help to
+others in the same situation.
+
+Let me start with a word about me: I have already experience with many
+Web frameworks (Zope/Plone, Twisted, Quixote, CherryPy, QP and Paste) and
+I am probably competent enough to write my own, if I wished [#]_. My
+colleagues at work are all competent Pythonistas but we are not really
+into Web programming. We actually do financial software and we just need
+a Web interface to manage the requests of our customers. In other
+words, we are NOT looking into a framework to write e-Commerce sites,
+community sites, blogs, etc. We need a building block on top of which
+to write a very customized application which fits our very specific
+needs. So my evaluation below (this framework is "good"/"bad") must
+be read in the light of our requirements, not in absolute terms.
+
+.. [#] Notice that I claim that I am competent enough to write a Web
+ framework, but I do *not* claim that I am competent enough to
+ write a *good* Web framework.
+
+Of Plone, Quixote, QP, CherryPy and Twisted
+---------------------------------------------------------
+
+The framework we use at work now is Plone and I have been using it for
+four years; I never liked it, even at the beginning (it was my first Web
+framework) and every day I dislike it even more. My colleagues are not fond of
+it either and this is why for new projects we are looking at a
+different framework. Of all the frameworks I cited before, the one I
+like the most for its design and philosophy is Quixote (perhaps not
+coincidentally, since it was designed from the beginning to be an
+anti-Zope framework). Some (Ian Bicking IIRC) labelled Quixote as
+"the framework for hackers", since it is really designed for old
+school boys used to the Unix way of thinking, and also because its
+marketing totally sucks [#]_.
+
+Quixote makes the uncommon choice
+of using Python as template language (well, actually they hacked a bit
+Python to make what they call PTL (Python Template Language) [#]_, but the
+differences with pure Python are minimal) which I wholeheartedly
+support. Templates makes sense if you have mostly static pages and if
+you work with graphical designers, but neither is our case.
+
+I think Quixote can still be recommended for some users (for instance,
+if you want an absolutely stable framework you should go with it,
+since its development virtually stopped years ago and it will probably
+never resume) but most people probably will not want to start
+with a "dead" framework. I looked at the successor of Quixote,
+QP, which shares the same philosophy. It is fine but it is nearly
+completely undocumented, it is less simple than Quixote, and it is
+even less known and used.
+
+I looked at CherryPy, but I never did anything serious with it,
+because at each new major version (1, 2, 3) they completely broke
+backward compatibility and this was a showstopper for me. I used
+Twisted Web, and it is fine, however:
+
+1. Twisted Web is going to be replaced with Twisted Web2, so there is
+ no point to use it for new projects;
+2. Twisted Web2 has been in development for ages and who knows when
+ it will be finished;
+3. In any case using Twisted means that we have to rethink various
+ applications we have (which are blocking) and that we must use
+ Twisted.enterprise and not the support for database we already
+ have and know well.
+
+In short, Twisted Web is cool but is seems a risky choice at the
+moment. Twisted developers themselves basically say "don't use it
+unless you feel adventurous" [#]_ .
+
+At EuroPython 2006 I grokked WSGI and after that I am
+convinced that WSGI is the one obvious way to go. So I looked at
+Paste and I was happy with it. Actually, the more I look at Paste
+the more I like it. That does not means that I like Paste in full
+(for one, I don't
+care at all about the thread support, I am convinced the right
+way to go is to write single-threaded programs and to run them in
+multiple processes, for instance via Apache and mod_wsgi)
+but it is well written in the
+sense that I can extract from Paste what I need and write my own
+framework with almost no effort. This was the design goal of Paste
+from the beginning and I think Ian Bicking succeded; this is not
+a minor feat.
+
+OTOH, we asked ourselves "why should we write our own framework on top of
+Paste where there is an already written framework built on top of
+Paste called Pylons"? So we evaluated Pylons on the field,
+by writing a couple of test applications and
+by porting a pre-existing Paste application. A detailed summary of our
+finding follows.
+
+.. [#] which is one of its strongest points IMO.
+
+.. [#] nowadays PTLs have been superseded by a "templating" system
+ called qpy which is a newer and improved version of PTLs,
+ practically backward-compatible and used in the framework QP; I
+ still say "templating" with quotes, since in pratice this is not a
+ real templating language, it is just pure Python with minimal
+ changes.
+.. [#] http://twistedmatrix.com/trac/wiki/WebDevelopmentWithTwisted
+
+Of Pylons
+-----------------------------------------------------
+
+Pylons has got some good press recently and people I trust spoke well
+of it in c.l.py, so I started with good hopes. At the present,
+however, I am not as happy as when I started. The impression it that
+the framework is still new, still fragile, too much cutting edge
+and with too many dependencies. This was not entirely unexpected,
+though. However I did expect porting a Paste application to Pylons to
+be a breeze: it turned out it was not the case. Probably most
+of the problems we encountered are due to our ignorance with the
+framework, but still I would have expect to encounter much less issues
+[#]_.
+
+Pylons is basically a
+collection of third party eggs with some glue in it.
+The Pylons-related eggs I have in my site-packages are the following
+(in alphabetical order):
+
+1. Beaker-0.7.5-py2.5.egg
+2. decorator-2.2.0-py2.5.egg
+3. FormEncode-0.7.1-py2.5.egg
+4. Mako-0.1.8-py2.5.egg
+5. nose-0.10.0b1-py2.5.egg
+6. Paste-1.4.2-py2.5.egg
+7. PasteDeploy-1.3.1-py2.5.egg
+8. PasteScript-1.3.6-py2.5.egg
+9. Pylons-0.9.6-py2.5.egg
+10. Routes-1.7-py2.5.egg
+11. SQLAlchemy-0.3.10-py2.5.egg
+12. WebHelpers-0.3.2-py2.5.egg
+
+Here is my evaluation of each of them, using the Pythonic score of
++1, 0, -1 (+1 means "good for the kind of applications we are
+interested in", -1 means "not good", 0 means I have not strong
+opinion).
+
+1. Beaker [+1]
+
+It is the session management mechanism. It looks okay.
+
+2. decorator [0]
+
+I am the author of this module and it may surprise people that I am
+not +1 on it. But the reason is easy to explain, once you understand why
+I wrote the decorator module in the first place. The decorator module
+comes out from a shortcoming of the standard library: as of now, it is
+very difficult to write signature-preserving decorators unless you use
+the decorator module or the DecoratorTools by P.J. Eby. I wrote the
+module to make people aware of this shortcoming and hoping from a
+better solution at the core Python level. The better solution is now
+forthcoming (PEP 362 Function Signature Object [#]_) and in future
+versions of Python it will be
+possible to fiddle with the signature of functions directly. Then the
+decorator module will become obsolete and I don't want to use in
+production a technology which I am already know is going to be
+obsolete. On the other hand, it may take years before we switch to a
+Python version with a proper signature object so the decorator module
+can be useful meanwhile. Finally, I do not use many decorators in
+practice (I use them only if there are no better alternatives).
+This is why my score is 0 for the moment.
+
+3. FormEncode [+1]
+
+I have not tried it in person but my coworker Lawrence Oluyede
+says it is okay.
+
+4. Mako [-1]
+
+As I said before, as a matter of principle I am against templating
+language and I prefer to write Python code. Template languages makes
+sense if you pass them to a graphic designer, but then they should be
+valid (X)HTML, compatible with the tools used by the designers and this
+is not the case of Mako. Besides, nowadays everything graphic should
+be done with CSS and I see nothing bad in generating the page from
+Python. Separation of logic and presentation is a matter of discipline
+and has nothing to do with the existence of a templating language.
+Besided, in our firms everybody understand Python better than HTML.
+
+5. nose [+1]
+
+The unittest framework in the standard library sucks and we absolutely
+need something better, compatibile with the past, easy to install and
+that works. I think *nose* fits the bill. I especially like the *py.test*
+inspired (a better word would be stolen) features.
+Incidentally, the change form nose-0.9 to nose-0.10 once broke my
+Pylons installation, this is one of the reasons I say Pylons is
+fragile. Also I would
+recommend to use just the basic features of *nose* because I am sure
+these will stay, where other things like the plugin system have
+already changed.
+
+6. Paste [+1]
+
+As I said I like Paste. It is well written, well documented and with a
+design philosophy I agree with. As I said the only thing I am skeptical about
+is the thread support. Notice that I do not mean that Paste
+support for threads is of of low quality (far from it!): it is just
+that I am on the anti-thread camp and that by choice I
+avoid them when I can. The thread support is making Paste much more
+complicated that it would be without it. Anyway, I am sure the thread
+support will make happy the fans of threads and the poor guys
+condamned to work on platforms without fork.
+
+7. PasteDeploy [0]
+8. PasteScript [0]
+
+I am a big fan of .INI configuration files for simple applications.
+However, the configuration of a Web application is complicated
+enough to stretch the limit of .INI files. So I don't like
+particularly the Paste configuration mechanism. I think the
+configuration file should be in a format like JSON or in pure
+Python. At work we already use a configuration mechanism based
+on configuration classes (so that we may inherit from configurations)
+and it is easier for us to build on it than to use Paste mechanism.
+Moreover I have already equivalents of the paster utility, which I wrote
+by stealing ideas from QP; it is not surpring in retrospect to
+discover, by looking at the comments in the source code, that Ian
+Bicking went further and even took code from QP.
+
+9. Pylons [-1]
+
+I don't think Pylons is adding much value to the other components.
+I think it would take less time to write myself the glue code
+than to understand how Pylons did it. As a proof of concept yesterday I
+took the two test Pylons application we wrote and I removed the
+dependency from Pylons in four hours. I just had to write a few lines
+of code for the SQLAlchemy support and a few lines for the javascript
+support. Then I removed the mako templates, I converted the Pylons
+controllers into pure WSGI applications and I removed Routes
+support by using paste.URLMap instead. I think now the code is
+much simpler, less coupled and it does the same with smaller effort
+and exactly as I want it to do it.
+
+10. Routes [-1]
+
+I have no Ruby On Rails background, so I don't see the advantages of
+routes.
+
+11. SQLAlchemy [?]
+
+SQLAlchemy is big and should be evaluated on its own. One thing to say
+is that the change form 0.3.9 to 0.3.10 broke our test application, and
+that SQLAlchemy did not cooperate well with pymssql. So, I would still
+wait until the framework will stabilize.
+
+12. WebHelpers [?]
+
+I still have to evaluate it.
+
+
+.. [#] for instance we had a Paste application making plots, saving them in
+ a temporary file and returning them as 'image/png'; in Pylons,
+ to make Routes and the Controller happy, my coworked Lawrence
+ had to copy the temporary file in the public directory and to remove the
+ start_response call in the original code.
+
+.. [#] http://www.python.org/dev/peps/pep-0362
+
+What about Diango?
+---------------------
+
+I can't say anything about Django, since I never used it. However my
+coworker Lawrence who has used it says it is this more stable and
+better thought than Pylons and I usually believe Lawrence.
+
+Conclusions
+--------------------------------------
+
+All in all, at the moment I am not much in favor of Pylons over Paste. OTOH,
+it may happen that a killer application will appear for Pylons, which
+will help enormously with our business, so we may still want Pylons
+with all its dependencies. As of now, I would do our things in Paste
+and wait and see for the new developments in the Pylons word.
+
+**Disclaimer to the reader**: since I only spent a couple of days
+for this evaluation, in the future
+I may well realize that I was wrong and change my mind.
+So take this evaluation (as any evaluation) *cum grano salis*.
+You and only you can decide what it is good for your situation.