Django community: Community blog posts RSS
This page, updated regularly, aggregates Community blog posts from the Django community.
-
Celery init scripts for Gentoo
I’m using django-celery on a project. The only difficult part was that gentoo ebuilds would not provide init scripts. It might be that some ebuilds in some obscure overlay provides those, but this was far too far away from the mainstream portage tree for me. Yes, the documentation about celery has some scripts using supervisord, [...] -
Django in Production: Part 2 - Background Tasks
This is the second part in a series about Django in Production. If you haven't already, read part 1 here. In my last post, I described in detail the core stack which powers a Django application in production. In this second part, I'll talk about something which has become commonplace in modern web applications - background tasks. Often websites perform complex tasks which take a long time to finish. These tasks don't always need to be done before the response is sent to the browser, so can be executed elsewhere. In cases like this, tasks can be performed asynchronously, by one or more "workers" which consume a task queue. Celery The most common task queue used with Django, at least in my experience, is called Celery. Celery is an asynchronous task queue/job queue based on distributed message passing. It is focused on real-time operation, but supports scheduling as well. Celery isn't dependant on Django in any way - it's a completely separate application. It does, however, integrate extremely well with Django projects. By installing the django-celery package and then adding djcelery to the list of INSTALLED_APPS, Celery can be run and managed through Django itself - thanks to a set … -
How to contribute translations
Recently we have been asked how to contribute translations to LFS. There are two preferred ways: If your are a (Django-)developer you might want to fork django-lfs and django-lfstheme on bitbucket.org, add the translations as you used to, commit them and send us a pull request. If your are a translator you can just go to transifex, choose or add the language of your choice and start to translate via the web interface. Once you are ready we would add your translations to the source code. If none of these fit your workflow you can of course just send us the translation files :-) If you have further questions don't hesitate to get in touch on one of the following places: Official page Documentation on PyPI Demo Releases on PyPI Source code on bitbucket.org Google Group lfsproject on Twitter IRC -
Meta-blog about the blog
I’m going to go a little meta and discuss the aspects of this project behind the project itself. Why would someone want to blog every day? To educate those who don’t know what you do To learn more about a topic you already know – regardless of what you think of your knowledge you will be doing LOTS of research and experimentation along the way. To practice writing and communicating on technical topics. This isn’t easy, and I’ve been “writing” for a while. What does it take? Interest in the topic you’re writing about. A little (or lot!) knowledge helps too. Discipline – nearly every day there’s some degree of “meh I do NOT want to do this, or at least there was for me. Once I reached the 3/4 mark though it switched to “meh I do NOT want to do this, but I’m so dang close to succeeding!” Basic blog software. Like I said at the beginning of the month, my time was better spent writing content that taught than hacking on some blog I could then use. You’ll bikeshed the crap out of a blog you build yourself, don’t fall in this trap. My advice Take it … -
Getting to Continuous Deployment in Django: Feature Flipping
This post is a first in a series of posts about our move towards continuous deployment using Django. Continuous deployment is a process by which code that is written for an application is constantly deployed into production without manual intervention. This allows us to be agile, to quickly innovate, and more importantly, to bounce back from any grave errors, unscathed. When it comes to building new features, this can involve merging feature branches, rigorous code review, testing, and deployments, before you can test it out on a live environment. Every subsequent release to different groups of users would require code changes, and deployment. This can be avoided by employing feature flipping, which is an essential step towards achieving continuous deployment in your application. So what is this feature flipping thing, anyway? In its most basic form, you can think of it as applying an on/off switch to a piece of code in your codebase thereby releasing or rolling back a feature. This allows you to constantly push new code for features that you’re not quite ready to release to any of your users yet. And when you’re ready, you can do a gradual rollout of the feature – to various … -
Developers guide to Running Django Applications on Heroku
Heroku the platform as a service (PAAS) company, very popular in the Ruby on Rails community, has now started opening up their platform to languages besides Ruby. They now offer support for Python, Java, Clojure, Node.js, and Scala on their new Cedar stack. Heroku's Cedar stack is still in beta, but that shouldn't stop you from trying it out, and that is just what I'm going to do. 6 months ago I wrote a series of blog posts that reviewed all of the cool new django hosting services that were popping up. My goal was to look at them all, and compare them to find out what they had to offer, and to see if I could use them on my future projects. I'm going to review Heroku using the same process that I used to review those other services, so that I can we can compare apples to apples. For those of you who are not familiar with my other blog posts, feel free to check them out now ep.io, apphosted.com, gondor.io, dotcloud.com, DjangoZoom.com, Django hosting roundup. For those of you that are lazy, I'll sum it up pretty quickly. What I'm trying to do is pretty simple, I … -
Allowing front-end geographic input
As great as the Django Admin is, it’s not for most of your users. So what do we do to allow user-submitted geometries? Cue django-floppyforms which contains handy widgets we can use with our own forms and modelforms to allow geographic input. Consider this model: class MyArea(models.Model): name = models.CharField(max_length=64, unique=True) point = models.PointField(srid=4326) polygon = models.MultiPolygonField(srid=4326) Throw this in views.py import floppyforms as forms from django.http import HttpResponseRedirect from django.shortcuts import render_to_response from django.template import RequestContext from formstuff.myarea.models import MyArea class OSMPointWidget(forms.gis.PointWidget, forms.gis.BaseOsmWidget): map_srid = 900913 class OSMMultiPolygonWidget(forms.gis.MultiPolygonWidget, forms.gis.BaseOsmWidget): map_srid = 900913 class AreaForm(forms.ModelForm): point = forms.gis.PointField(widget=OSMPointWidget) polygon = forms.gis.MultiPolygonField(widget=OSMMultiPolygonWidget) class Meta: model = MyArea def editing(request): form = AreaForm(request.POST or None) if form.is_valid(): form.save() return HttpResponseRedirect('/') return render_to_response('area.html', { 'form': form, }, context_instance=RequestContext(request)) and users can drop points and polygons on your model, which will be saved into the database. Do you want the Google basemap instead? Extend BaseGMapWidget instead of BaseOsmWidget, remove the srid attrib, and you’re set. It’s amazing how easy those widgets make it – you don’t even have to know you’re dealing with a geometry in your save method. -
Working with files in Django – Part 3
First part of this article is here. How to add STATIC files You will most likely add STATIC files to your source code repository. As they are likely to be hardcoded in your code and templates it is a good idea to keep those and your STATIC files in sync. Your STATIC files are collected [...] -
Many-to-many field, save() method and the Django admin
-
Improving the Admin
The Django admin saves us mountains of time. Back when Django still wasn’t quite Django and it was an internal project it was common for the team to leave a meeting, scribble a schema on a napkin and have the admin ready for data entry in the matter of a couple hours. Models are still my first stop for any project – build the basic frame, and start gathering data with the admin. But over the years we’ve all come to expect more from applications and Django has gotten much better tools for it too. Need to reorder fields? Hide the stuff that rarely gets entered? Use a custom form? It’s in the docs. With the GeoDjango admin though, things aren’t as well documented. So let’s look at some of the simplest things that can make an application better. Changing the default map Two modes are available, admin.GeoModelAdmin and admin.OSMGeoAdmin. GeoModelAdmin uses very simple tiles from OpenLayers that have state lines, rivers / water sources and a few other unmarked areas. I can’t imagine how it would be useful because there’s nothing to reference from, but if you have your own set of WMS tiles you can set wms_url and … -
Forking and merging on bitbucket
For some recent work I was doing with Satchmo's Fedex module, I decided to go through the process of forking on bitbucket with the eventual goal of merging this back into Satchmo tip. Over time, I've had many folks try to fork Satchmo and issue pull request back to bitbucket but some people end up with a bit of a tangled mess. This article covers a basic process for maintaing your fork. -
Django Suite III: Usando virtualenv y pip.
Tercera entrega de la serie sobre Django, esta vez no hablaré del framework en si, sino de un par de herramientas básicas del ecosistema de Python para ayudarnos a ser mas ordenados a la hora de desarrollar proyectos. Virtualenv es una herramienta que nos ayuda a crear ambientes aislados para Python en palabras mas simples instala las bibliotecas e intérprete en una carpeta separada a la de nuestra instalación en el sistema operativo, la ventajas están en que nos provee una manera fácil, rápida, segura y reproducible de hacer desarollo y pruebas de diversas aplicaciones. Por otra parte pipes una herramienta para instalar paquetes de Python desde el Python Package Index que es el repositorio comunitario de paquetes. En conjunto con virtualenv, pip nos ayuda a tener todo organizado y limpio. Usando Virtualenv Primeramente lo instalamos con nuestro manejador de paquetes favorito, en caso de ubuntu el paquete se llama "python-virtualenv" luego procedemos a crear nuestro primer ambiente virtual. virtualenv primer_ambiente --no-site-packages Donde primer_ambiente es el nombre que deseamos ponerle y--no-site-packages es un parámetro para que se cree un ambiente totalmente limpio tal y como fuera una instalación básica de python sin ninguna biblioteca extra. La ejecución de este comando … -
Katie finally talks about her fabfiles
Every time I post about using Fabric, I get the same request: please post my Fabric files. I always intend to, but stop short. Commenter Justin made me realize what had been holding me up. Fab files are usually honed for the style of the developer and project. So, rather than ... -
Introduction to South Migrations
South Migrations are becoming the de-facto standard for those that need to use migrations in Django. They are also very useful as well. This video is an introduction to using south migrations in your projects whether starting a new application or adding it to an existing one. Watch Now... -
Introduction to South Migrations
South Migrations are becoming the de-facto standard for those that need to use migrations in Django. They are also very useful as well. This video is an introduction to using south migrations in your projects whether starting a new application or adding it to an existing one. Watch Now... -
Django Suite III: Usando virtualenv y pip.
Tercera entrega de la serie sobre Django, esta vez no hablaré del framework en si, sino de un par de herramientas básicas del ecosistema de Python para ayudarnos a ser mas ordenados a la hora de desarrollar proyectos. Virtualenv es una … Continue reading → -
Making simple map images with qGIS
Occasionally you just need a quick map, and it’s not going to be used for interaction or even necessarily display on the internet (say a Keynote/PowerPoint presentation, for example). We could build it as a Google map, get a gigantic computer monitor and fullscreen the window and take a screenshot, and have it look like every other web map out there – or we can reach into the toolbox of those who are NOT neogeographers and borrow a few things. For me this tool is still qGIS (for Mac check out KyngChaos for binary builds), though there are alternatives like GRASS GIS and TileMill, to name only a couple. (TileMill is actually designed to create tiles similar to how Google Maps / OpenStreetMap do it, but you can shoehorn it to do “print” maps) Of course, it bears repeating that the results from doing this are not survey quality. Don’t use my recommendations / guidance to determine where not to dig to avoid buried lines, where to build a road, or anything else. But zoomed back a ways where the dot on the map is easily the size of a 40,000 population town, it’s close enough. Since this is a … -
Working with files in Django – Part 2
First part of this article is here. How to setup file serving for development server As I mentioned earlier, it is best to serve files on a fast HTTP server. But this setup is overkill for development environments, you can safely let Django handle your files. The snippet below relies on the assumption, behind the [...] -
Putting it all together, part 3
Now we make our code restrict to things near the user when they allow geolocation…but the results aren’t really what we’re shooting for. def earthquake_display(request): search_origin = False if request.GET.get('lat') and request.GET.get('lon'): search_origin = Point(float(request.GET.get('lon')), float(request.GET.get('lat'))) weekago = datetime.datetime.now() - datetime.timedelta(days=7) quakes = Quake.objects.filter(datetime__gte=weekago).order_by('-datetime') last_check = cache.get('usgs-poll-last-finished', datetime.datetime(2000, 1, 1)) checking = cache.get('usgs-poll-in-progress', False) if not checking: cache.set('usgs-poll-in-progress', True) latest_quake_ago = datetime.datetime.now() - quakes[0].datetime latest_check_ago = datetime.datetime.now() - last_check if latest_quake_ago > datetime.timedelta(minutes=90) and latest_check_ago > datetime.timedelta(minutes=90): from django.core import management management.call_command('load_quakes') cache.set('usgs-poll-last-finished', datetime.datetime.now()) # and refresh the QuerySet to get the new data quakes = Quake.objects.filter(datetime__gte=weekago).order_by('-datetime') cache.delete('usgs-poll-in-progress') checking = False if search_origin: quakes = quakes.distance(search_origin).order_by('distance', '-datetime') quakes = quakes[:25] return render_to_response('earthquakes.html', { 'object_list': quakes, 'checking': checking, }, context_instance=RequestContext(request)) <html> <head> <script src='http://media.adamfast.com/QueryData.compressed.js'></script> <script language='JavaScript'> function checkLocation() { var getData = new QueryData(); if ('lat' in getData) { } else { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( function (ppos) { window.location.href = window.location.href + '?lat=' + ppos.coords.latitude + '&lon=' + ppos.coords.longitude; }, function (err) { switch(err.code) { case err.TIMEOUT: alert('Attempts to retrieve location timed out.') break; case err.POSITION_UNAVAILABLE: alert("Your browser doesn't know where you are.") break; case err.PERMISSION_DENIED: alert('You have to give us permission!') break; case err.UNKNOWN_ERROR: alert('Unknown error returned.') break; default: … -
Goodbye
Hi everyone, unfortunately, Thomas and I have to say goodbye to our open-source community. We started contributing because we thought it was interesting and we had fun building something together. However, our projects have stopped being fun. We're not even using most of them, anymore (not even at our startup). This is why we've made a final decision: We've stopped maintaining our open-source projects. All of them. This primarily affects djangoappengine users. The MongoDB backend has its own capable contributors, so django-mongodb-engine users should be unaffected by this. We're really sorry, especially to those who have a business that depends on djangoappengine. Thanks to everyone who has supported us. If anyone is interested in continuing djangoappengine development, please send a mail to the Django-nonrel discussion group. Best wishes, Waldemar and Thomas Update: Thanks for your warm response! We really didn't expect that. Wilfred Hughes offered to take over, so hopefully our projects won't die. By the way, I'll try to keep blogging about web development, NoSQL, and App Engine. There's a whole lot of stuff we've learned and keep learning at our startup and I'd like to share that with you from time to time. Please also read the comments … -
30 second apache/nginx/gunicorn timeout
-
A day of thanks
In the spirit of the holiday (in the US we’re celebrating Thanksgiving) I thought I’d offer my appreciation / thanks to the projects I use and lean on to make my applications work. This isn’t a canonical list, I’m sure I’ve forgotten libraries here and there. And regardless of whether I use your code right now or not, thanks for releasing it where I can someday if it does something I need. I contribute everything I can when I can because everybody else has contributed so much that makes me more productive I want to follow suit. If you blog, I’d ask you to consider something alone these lines of your own. As software authors there are lots of instances where our code is doing things we have no idea about until we’re told. Python language Django django-socialregistration (I’ve got my own fork of this but it existing saved me a bunch of time!) dateutil PostgreSQL PostGIS Coverage.py django-coverage GeoPy python-twitter Metar Arduino – platform, software and hardware. I love these things and enjoy prototyping with them. This is in addition to all the OTHER stuff I use besides libraries – GitX, VLC, Audacity, QGIS, TileMill and others I’m sure. … -
Putting it all together, part 2
We’ve got our quakes app installed (update it if you’re following along at home, I committed a bunch of code changes for this entry) and our initial data imported. However, we need this data to be updated somewhat regularly for the service to be useful. Sean shipped django-quakes with Celery support (which I commented out of the requirements file because I’m running this app on the neat ep.io auto-scaling webapp service‘s free tier and don’t have Celery access. If you run Celery just re-enable it, if you don’t use Celery or even know what it is (check it out!) you can use cron to schedule it just as well. To avoid polling too often and bugging the USGS I’d set the interval at hourly or more under normal circumstances. We only care about quakes when our users do. I’d run it at least daily though so you keep history. Since we care when our users do and earthquakes can’t be convinced to ONLY hit at certain minutes after the hour, what do we do? How about we check the latest quake we have and see if it’s beyond a certain age to force a refresh? This is more of that … -
Preventing brute-force attacks with django
Brute-force attack prevention is a topic that gets mentioned every now and then in the Django community, on mailing-lists and at conferences. I've been thinking about this a little bit and I believe I found a very nice solution. Note that I'm only tackling the issue of brute-forcing user credentials, not rate-limiting in general. There are a bunch of ways to monitor login attempts: With a decorator applied to every login view, With a middleware that inspects incoming requests (note: this is a bad idea), With Nginx (or whatever your web server is), using HttpLimitReqModule Neither of these solutions are optimal: the admin accepts login attempts at arbitrary URLs, which makes it difficult to monitor, there are different ways to authenticate users, maybe you have an API that does Basic authentication, the nginx syntax is hard to get and maybe some day you'll need to move to something else. The solution is to put the rate-limit logic and the credentials verification logic at the same place: on the authentication backend. To do this, we need to make the authentication backend request-aware, in order to block people based on some criteria such as their IP or User-Agent. This requires: A custom … -
AJAX Pagination with handlebars.js
AJAX Pagination with handlebars.js