Blog of Lincoln Loop, a remote Python and Django consultancy, with posts on Django practices, testing, Nginx, and company culture.
Commenters recommend its Django best practices guide for deployment and project structure, and cite the company as a successful fully virtual shop.
I've tried out a few different tools now; the only two I've had any real success with were Capistrano and Fabric.
Capistrano works well, great git integration, but it does have some rails-isms you need to override to make it work sanely. The capistrano-php extension can help with that: http://github.com/namics/capistrano-php but you'll need to use gem to manage it. You'll also definitely want the multistage plugin which doesn't come standard. There were some bugs present in the CVS integration which may be a problem depending on your source control system.
I've also tried Fabric: http://docs.fabfile.org/0.9.2/ I liked the tool. I found it a bit more low level then Capistrano but also a little simpler to work with. It comes prepackaged (albeit an older version) in Ubuntu without any dependencies other than stock python which our sysadmin preferred to using Ruby gems. I do recommend the new version found in pip though. The two main problems with Fabric are its lack of any integration plugins and the Paramiko SSH library it uses has no support for SSH key forwarding (there is a workaround: http://lincolnloop.com/blog/2009/sep/22/easy-fabric-deployment-part-1-gitmercurial-and-ssh/ but it has its own set of problems).
In the end, neither worked out for me. Capistrano had to much of a learning curve for my co-workers and Fabric wouldn't work with our SSH setup. For now, I'm using a script in our working directory that I SSH to, run, and it updates the code in place. Crude, but…
I'm sorry you feel that way, as the developer of Pylons, I really don't look at this as killing Pylons anymore than the lack of any new functionality has killed Pylons 1.0 in the past 6 months.
Pylons 1.0 has been in maintenance mode already (effectively), 1.0 was in fact nothing more than a few tweaks on 0.9.7, ie. maintenance release with a 1.0 version number and finally killing a few deprecated things.
The FAQ explains why when attempting to extend Pylons for new functionality, I hit a dead-end:
http://docs.pylonshq.com/faq/pylonsproject.html#why-not-just-continue-developing-the-pylons-1-0-code-base
Finding a path forward for extensibility that didn't hit this forking problem:
http://lincolnloop.com/blog/2008/apr/4/reusable-django-apps-and-forking/
was a very major concern of mine. I think this will address that, and when Django makes the changes necessary to remove the forking problem I won't be at all surprised if it requires porting your apps...
Well, in total honesty, the very fact of using PyPy is already a performance optimization over the regular CPython interpreter.
(Although, this comparison is very interesting, it shows that not always PyPy will overperform regular CPython; it depends on what you are trying to do and if the system has just bootstrapped (after all, PyPy is a JIT compiler)):
https://lincolnloop.com/blog/speed-comparison-cpython-pypy-pyston/
All in all, i'm happy that there are alternatives to speed Python up, but i'm kind of a bit worried that the bottleneck on performance might be the Global Interpreter Lock (GIL), the big white-elephant-in-the-room that is never talked about often enough when discussing Python. Mind you, Python is one of my favorite languages and i've used it a lot, so no hate here.
There are projects for overcoming the GIL, for example PyPy with Software Transactional Memory, but they're still work in progress:
http://doc.pypy.org/en/latest/stm.html
There's "Django Best Practices", which was discussed two months ago (although it doesn't seem like it grew a lot since):
http://lincolnloop.com/django-best-practices/
HN discussion:
http://news.ycombinator.com/item?id=2936364
Any effort to assemble "field" knowledge around Django would be great. For instance, I was looking for best practices for splitting settings.py (separating dev, test and prod-specific configs). If anybody's interested, I went through: http://stackoverflow.com/questions/88259/how-do-you-configure-django-for-simple-development-and-deployment , http://www.djangobook.com/en/2.0/chapter12/ (under "Using Different Settings for Production") and https://code.djangoproject.com/wiki/SplitSettings ...
I think it really centers around ease of use, amount of libraries, and community support. Django is widely adopted, has a long history of use, and is relatively easy to get started with. Performance is obviously important, but there are plenty of major websites using Django, so it can scale. This is a decent thread on that: http://www.quora.com/Django-web-framework/What-is-the-highest-traffic-website-built-on-top-of-Django .
Here is a great comparison of Go and Django: http://lincolnloop.com/blog/djangonaut-building-webapp-go-gorilla/ .
I personally have used Django for quite a few projects, and haven't had any "I wish I used a different framework/language" moments.
I have been working on this recently, using nginx as the reverse proxy. Nginx makes it pretty trivial to limit requests based on various factors, like request rate, number of connections, etc. A post like https://lincolnloop.com/blog/rate-limiting-nginx/ has snippets that show how it works.
But the simplification is that you do not need to write any application code. I can very easily have certain routes or domains limited differently by updating the nginx config. Especially in a microservices world I am trying to avoid having to update N services to get all of them to be rate limited.