top | item 1780375

Ask HN: What Python web programming frameworks and tools are you using?

42 points| akamaka | 15 years ago | reply

I'm interested in hearing from the community about what tools you are using for building web applications in Python.

This was last asked about half a year ago (http://news.ycombinator.com/item?id=1357925) and 2 years before that (http://news.ycombinator.com/item?id=153487), but things are changing fast, especially with the recent popularity of NoSQL, so I think it's worth bringing up again.

So, what tools, databases, web servers and frameworks are you using for your latest Python web application projects? Or, if you've abandoned Python, what language have you moved to, and why?

45 comments

order
[+] luffy|15 years ago|reply
framework: Flask

database: Postgresql

server: UWSGI + Cherokee

Flask is a very nice framework, and the documentation is awesome. I've tried a lot of Python frameworks out before deciding on Flask. It's a paralyzing decision - there is just so much out there. The process of choosing a web framework is filled with information overload - from reading about the framework, dabbling with the code, and finally learning the actual framework. For the reason, I recommend going with a microframework. You learn what you need as you go. So this lead me to Flask.

Two things set Flask apart (for me) - the documentation and the extensions. Just check out the site http://flask.pocoo.org for more information. You also want to be assured that development on the framework is not just going to be dropped some day. It really feels like this framework is going places. (My initial inclination was toward CherryPy, but the documentation is bad. After all these years.)

My dev work is mostly done on Windows, and for an IDE I've taken to using JetBrain's PyCharm. (I'm primarily a .NET developer, and I find it more convenient to use Windows to avoid context switching. The fact that I deal with the massive and all-encompassing .NET is also a major reason I went with a Python microframework). On Linux, I can get by with Emacs.

Using Ubuntu in production environment.

[+] dawsdesign|15 years ago|reply
I've used Django for years, but Flask is the bomb.
[+] code_duck|15 years ago|reply
I like the idea of microframeworks. My first framework was rails; I struggled with it after being used to framework-less PHP. I was much happier when I found out about Sinatra! I'll have to check out Flask, though really Django doesn't get in your way too much for most tasks.
[+] code_duck|15 years ago|reply
Django, though I've realized that certain projects of ours could be implemented better with a more lightweight framework. Other than that, not much besides Komodo Editor and Kate and of course the rest of the usual LAMP stack.

I'm quite satisfied with Python. I can't see any reason to move to another language for general web development, but while Python is quite current and modern, it isn't esoteric, geeky or on the cutting edge. So, I'm dabbling with Clojure and Scala, specifically Scalatra and Compojure.

[+] regularfry|15 years ago|reply
First, a proviso: I'm learning. That being said, this is a commercial project, so it's got proper constraints on it.

I'm using web.py, testing with nose, doing database work with sqlalchemy to a postgres back-end. Looking at Paste and wondering if I should be using that as well, but currently a simple apache2 mod_wsgi container is doing ok.

I deploy to Debian stable but develop on Ubuntu Lucid, which means that in order to keep myself sane I've built Python 2.6 and virtualenv packages for debian, and install all the packages I need with pip. I'm still getting my head around this, because I've not used these tools at all before.

Deployment is done by pushing to a remote git master branch, where the remote live branch is what's checked out and running.

Styling is all blueprint.css, and I'm contemplating whether to use my usual Compass workflow or not. So far it's not been needed, but I haven't pushed things very far yet.

I'm not in the sort of space where NoSQL would be an advantage, so I can't comment on it.

[+] macco|15 years ago|reply
Framework: web2py With web2py the underlying tools don't matter much. For the sake of completion: MySql, Apache, Ubuntu, jQuery, ez-css.

But you can use whatever you want.

[+] rdw20101009|15 years ago|reply
framework: NONE, NONE, NONE web server: CherryPy database: SQLite for dev/test, PostgreSQL for prod, investigating NoSQL data access: SQLAlchemy database schema: SQLAlchemy-migrate OS: Ubuntu, but perhaps eventually NixOS DVCS: Mercurial via BitBucket dependency mgmt: APT, setuptools, perhaps Nix JavaScript: MooTools

I am a web application security engineer (among other things), so I screened and was forced to reject all frameworks because they don't adequately address security (not even webpy), and because they are too heavy.

Instead, I am building a very lightweight, simple, but integrated web content generation layer directly in Python using built-in string formatting. I construct a page using a trivial DOM-like object model that renders to a string web response (HTML, CSS, JS). I push Model data into the DOM-like View under the direction of a page Controller (MVC pattern). However, my View contains the logic to properly encode output contextually to avoid common security vulnerabilities in the web response. Likewise, I have exhaustive input validation to deal with the data in the web request.

[+] Luyt|15 years ago|reply
CherryPy, in combination with oursql (+DBUtils to make it multithread safe because libmysql.so isn't). Caching is done by memcached (plus, I must look into Varnish). Templating by HTMLTemplate. I made two small patches to CherryPy to make it more agreeable for a site which serves 900 domain names (using the VirtualHost dispatcher).
[+] madhouse|15 years ago|reply
Python: Django (+ various modules) & fabric

Web Stuff: jQuery, less.js

Database: PostgreSQL

Tools: Emacs

[+] andymoe|15 years ago|reply
- TextMate

- Google App Engine

- http://www.tipfy.org (GAE specific framework)

[+] vosper|15 years ago|reply
I hate App Engine, but unfortunately I will probably be doing at least a few more projects on it, so thanks for the link to tipfy, maybe it'll help.
[+] hanula|15 years ago|reply
Setup: * Pylons+SQLAlchemy+formencode+Mako+WSGI apps * PostrgeSQL * Nginx

Tools: * Virtualenv * Fabric

Best combination. Zope, Django, Web2py, web.py are just not that flexible & reliable for advanced web applications (IMHO).

[+] mdipierro|15 years ago|reply
and of course this is a completely neutral and unbiased suggestion. LOL
[+] endlessvoid94|15 years ago|reply
Django.

Disclaimer: We're about to launch Djangy.com, so my opinion is obviously biased.

[+] sushi|15 years ago|reply
I happen to have a djangy account and I tried some of it few days back. I made a simple hello world app and deployed it but it took longer time to go live than I had anticipated, esp. in comparison to Appengine.

Other than that I'd like if you could also give a sense of expenses that I might run into if I deploy my app on djangy. The details in terms of pricing are lacking there.

Just some feedback. I know it's in private beta. All the best.

[+] Tycho|15 years ago|reply
GAE confuses me. How does one create a dynamic user interface? Does Django cover that? I'm trying to build a simple program that's a sort of GUI/wizard for composing SQL queries. It would be dead easy in .NET but I don't know where to start with GAE/Python. Is the idea that you build the front end in Javascript/HTML and your Python code does the processing behind the scenes? This is probably a n00b question but I'm finding it hard to get answers.
[+] vosper|15 years ago|reply
You can compose queries like this:

query = myModel.all().filter("property_1 =", value)

query = query.filter("property_2 =", value)

Here's a gotcha... be sure to have a space between "property_1" and "=", "property_1=" won't work (but it won't raise an error either).

Be aware that the Datastore has very limited support for querying in general, and you will certainly not have anywhere near the kind of power you are used to when composing queries in .Net with something like LINQ.

GAE is a good start if you want to learn Python, but it is a terrible platform for web development. You will find yourself stymied and frustrated by its inflexibility, the need to give up your normalized data model from Day 1, lack of referential integrity, and the awful performance compared to a real SQL database.

Oh, and the constant outages, the scheduled maintenance that borks the whole system for a week, the backup tool that takes 4 hours to run and then crashes trying to restore the backups... I have a long list :)

[+] endtime|15 years ago|reply
I haven't used GAE, but if I generalize your question a little bit then I can answer it in the context of Django. You run a WSGI server that receives HTTP requests. It uses the regex-based URL mapping you write in your Django app to work out which view function to call (and, optionally, with which parameters). This function talks to the database, runs whatever logic you need, collects the relevant data for the UI and uses it to render a template, the result of which is then returned to the user.

Django templates look a lot like HTML, but with special Django stuff in them. You can get the general idea from this page: http://docs.djangoproject.com/en/dev/ref/templates/builtins/

And yes, you write in JS pretty much the same stuff that you'd always write in JS.

[+] mdipierro|15 years ago|reply
If you use web2py, web2py does that for example here is complete code to create a page that lets user post messages and read previous messages.

    m=db.define_table('message',Field('body'))
    def index():
        return dict(form=crud.create(m),rows=db(m).select())
It runs on GAE as it is (requires the scaffolding app).
[+] _b8r0|15 years ago|reply
I use Django and PostgreSQL. Currently I'm using Eclipse which is much slower than Vim, but leaves my Vim free to do more general text editing (like RST).
[+] dochtman|15 years ago|reply
CouchDB (with couchdb-python) and Jinja on top of bare WSGI (through mod_wsgi). Werkzeug is looking appealing, though. On the browser side, jQuery.
[+] sgt|15 years ago|reply
For what I use python for on the web at this moment, I basically use Pylons and implement a RESTful API. I can then use jQuery on the front end.
[+] tamentis|15 years ago|reply
Pylons, Postgresql on Apache with mod_wsgi, I also have a few deployements with cherrypy behind mod_proxy and a few wsgi apps without framework.
[+] abiczo|15 years ago|reply
Webob + a few WSGI middleware libraries, Mako, MongoDB, mod_wsgi (Apache), Varnish

I'll probably try Flask for my next project.

[+] rbanffy|15 years ago|reply
stand-alone Django, GAE (and its built-in Django fragments). Database: MySQL. IDE: Emacs and Eclipse (for GAE work) That said, I miss Plone and Zope. I really wish we could return our heavyweight Java-based CMS and get our money back...
[+] dayski|15 years ago|reply
django with postgresql. The reason for Django was because of the admin screens that cut down the dev time for the custom cms that i built. if I take admin screens out of the scope, I most likely would have gone with Pylons ...
[+] Maascamp|15 years ago|reply
Tornado, Postgres, sqlalchemy, nginx, fabric, PyDev(Eclipse)
[+] thedangler|15 years ago|reply
how did you get that setup working?