views:

1884

answers:

5

I'm lucky enough to have full control over the architecture of my company's app, and I've decided to scrap our prototype written in Ruby/Rails and start afresh in Python. This is for a few reasons: I want to learn Python, I prefer the syntax and I've basically said "F**k it, let's do it."

So, baring in mind this is going to be a pretty intensive app, I'd like to hear your opinions on the following:

  • Generic web frameworks
  • ORM/Database Layer (perhaps to work with MongoDB)
  • RESTful API w/ oAuth/xAuth authentication
  • Testing/BDD support
  • Message queue (I'd like to keep this in Python if possible)

The API is going to need to interface with a Clojure app to handle some internal data stuff, and interface with the message queue, so if it's not Python it'd be great to have some libraries to it.

TDD/BDD is very important to me, so the more tested, the better!

It'll be really interesting to read your thoughts on this. Much appreciated.

My best,

Jamie

+4  A: 

I'm new to python myself, and plan to get more in depth with it this year. I've had a few false starts at this, but always professional needs bring me back to PHP. The few times I've done some development, I've had really good experiences with web2py as a python framework. It's quite well done, and complete in features, while still being extremely lightweight. The database layer seems to be very flexible and mature.

As for TDD/BDD and the rest of your questions, I don't have any experience with python options, but would be interested to hear what others say.

Nick Jennings
A: 

Python is awesome but be aware that it's not something that excels in the area of web applications. It's a jack of all trades, but master of none.

Back on topic.

Frameworks: When I looked into Python frameworks a while ago I narrowed my choice down to either Django or TurboGears. TG seemed to be easier to work with while Django was more popular. I never tested both of them as I decided to stick with PHP at the time.

ORM: SQLAlchemy seems to be a good one: http://www.sqlalchemy.org/

Yorick Peterse
What makes you say that it doesn't excel for web applications?
mipadi
The only mature purpose designed language I can think of for web applications is PHP? I'd much prefer to use something more general purpose like Ruby or Python - partly because of that general purpose nature
Garethr
Because it wasn't exclusively designed for the web, whereas PHP is. I love Python and the way it works, I just never felt it was "the thing" for web applications.
Yorick Peterse
@Yorick PHP was designed as a templating language, much like the `{{ foo }}` tags in Django, and it does a great job doing that! But, IMO, if you're using it for anything other than presentation you should probably think a little harder about what you're doing.
indieinvader
PHP designed as a templating language? I don't think so...
Yorick Peterse
internet was designed as a military communication system, so what? is it doing a great job doing `{{ just }}` that?
Devrim
+22  A: 

Frameworks

OK, so I'm a little biased here as I currently make extensive use of Django and organise the Django User Group in London so bear that in mind when reading the following.

Start with Django because it's a great gateway drug. Lots of documentation and literature, a very active community of people to talk to and lots of example code around the web.

That's a completely non-technical reason. Pylons is probably purer in terms of Python philosophy (being much more a collection of discrete bits and pieces) but lots of the technical stuff is personal preference, at least until you get into Python more. Compare the very active Django tag on Stack Overflow with that of pylons or turbogears though and I'd argue getting started is simply easier with Django irrespective of anything to do with code.

Personally I default to Django, but find that an increasing amount of time I actually opt for writing using simpler micro frameworks (think Sinatra rather than Rails). Lots of things to choose from (good list here, http://fewagainstmany.com/blog/python-micro-frameworks-are-all-the-rage). I tend to use MNML (because I wrote parts of it and it's tiny) but others are actively developed. I tend to do this for small, stupid web services which are then strung together with a Django project in the middle serving people.

Worth noting here is appengine. You have to work within it's limitations and it's not designed for everything but it's a great way to just play with Python and get something up and working quickly. It makes a great testbed for learning and experimentation.

Mongo/ORM

On the MongoDB front you'll likely want to look at the basic python mongo library ( http://api.mongodb.org/python/ ) first to see if it has everything you need. If you really do want something a little more ORM like then mongoengine (http://hmarr.com/mongoengine/) might be what you're looking for. A bunch of folks are also working on making Django specifically integrate more seamlessly with nosql backends. Some of that is for future Django releases, but django-norel ( http://www.allbuttonspressed.com/projects/django-nonrel) has code now.

For relational data SQLAlchemy ( http://www.sqlalchemy.org/) is good if you want something standalone. Django's ORM is also excellent if you're using Django.

API

The most official Oauth library is python-oauth2 ( http://github.com/simplegeo/python-oauth2), which handily has a Django example as part of it's docs.

Piston ( http://bitbucket.org/jespern/django-piston/wiki/Home) is a Django app which provides lots of tools for building APIs. It has the advantage of being pretty active and well maintained and in production all over the place. Other projects exist too, including Dagny ( http://zacharyvoase.github.com/dagny/) which is an early attempt to create something akin to RESTful resources in Rails.

In reality any Python framework (or even just raw WSGI code) should be reasonably good for this sort of task.

Testing

Python has unittest as part of it's standard library, and unittest2 is in python 2.7 (but backported to previous versions too http://pypi.python.org/pypi/unittest2/0.1.4). Some people also like Nose ( http://code.google.com/p/python-nose/), which is an alternative test runner with some additional features. Twill ( http://twill.idyll.org/) is also nice, it's a "a simple scripting language for Web browsing", so handy for some functional testing. Freshen ( http://github.com/rlisagor/freshen) is a port of cucumber to Python. I haven't yet gotten round to using this in anger, but a quick look now suggests it's much better than when I last looked.

I actually also use Ruby for high level testing of Python apps and apis because I love the combination of celerity and cucumber. But I'm weird and get funny looks from other Python people for this.

Message Queues

For a message queue, whatever language I'm using, I now always use RabbitMQ. I've had some success with stompserver in the past but Rabbit is awesome. Don't worry that it's not itself written in Python, neither is PostgresSQL, Nginx or MongoDB - all for good reason. What you care about are the libraries available. What you're looking for here is py-amqplib ( http://barryp.org/software/py-amqplib/) which is a low level library for talking amqp (the protocol for talking to rabbit as well as other message queues). I've also used Carrot ( http://github.com/ask/carrot/), which is easier to get started with and provides a nicer API. Think bunny in Ruby if you're familiar with that.

Environment

Whatever bits and pieces you decide to use from the Python ecosystem I'd recommend getting to who pip and virtualenv ( http://clemesha.org/blog/2009/jul/05/modern-python-hacker-tools-virtualenv-fabric-pip/ - note that fabric is also cool, but not essential and these docs are out of date on that tool). Think about using Ruby without gem, bundler or rvm and you'll be in the right direction.

Garethr
I will mention [buildout](http://buildout.org) as an alternative to virtualenv. IMO it solves the same problem and gives you more. I spent a couple of months in indecision but in the end, 'bin/buildout' gave me my isolated libraries , my choice of interp, and a build system that is relocatable and deployable.
chiggsy
I highly recommend Flask as a web dev framework. Check it out.
Kenneth Reitz
A: 

I am using Twisted Framework based Nevow library for python based web app.

All your criteria fit into this single framework.

Surya
The 'templating language' that Nevow is just awful if you've ever done web programming before - basically it involves [writing HTML with python code](http://divmod.org/trac/wiki/DivmodNevow/TutorialTwo). If you're stuck on using Twisted and want to use a modern framework, I'd recommend [Cyclone](http://github.com/fiorix/cyclone). It's modeled after Tornado, which is a WSGI-style app, but built on Twisted which has great async libraries for things like MongoDB.
Derek Dahmer
+5  A: 

Ok, you might be making a mistake, the same one I made when I started with python.

Before you decide on a thing like django, which is an excellent, yet atypical python web framework, spend an night cuddled up with:

This, is a good start. Make sure you do A little Werkzeug watching , Then check out some classic WebOb. Maybe, if you feel the fire in the blood, and you might, wsgi is a bit flawed, but only to the gods, check out Flask

I'm not saying use it, Django is beautiful too, but if you don't know python, and you go through django, you run the risk of learning a framework.

WSGI is super straightforward. You'll find out about Paste, and Pastescript, and Pylons.

Then, make your decision. It'll be much easier learning stuff doing bare bones wsgi or Flask, stuff like variable assignment, using the interpreter, style concerns, testing, on 3 files for a couple of nights, instead of django. Take 2 nights. Then you'll see the great similarity between python web frameworks, instead of the differences. Hell, you might even roll with Flask.

Just some advice, I did the same thing with ruby, going in through Rails, and... well, strong words were said.

Language, then basic wsgi and testing, then pick your framework and roll

chiggsy
That's pretty good advice actually, thank you. I'm actually learning Python alongside Django - I'm using it outside of Django for some other stuff.
Jamie Rumbelow