Django community: RSS
This page, updated regularly, aggregates Community blog posts from the Django community.
-
Conheça o Django Packages
Conheça o Django Packages -
Python, Unicode and UnicodeDecodeError
Unicode and Encodings OK, let's take a step away from text for a moment. I want you to think of a number between one and ten. Got one? Great - now, grab a pen and paper, and write it down.What number did you think of? Well, I thought of the number six. And when I wrote it down, it looks like this: Of course, if I were an ancient Roman (or possibly a clockmaker), I could have written this: They all mean the same thing - the number six. But we've written them in different ways. In other words, we've 'encoded' our idea of the number six in our head in three different ways - three different encodings.The separation of the idea of 'the number six' from its actual representation is basically all Unicode is. The Unicode Character set (UCS) defines a set of things (loosely, a set of letters) that we can represent. How we represent each of those letters is called an encoding. There's only one Unicode, but there are many encodings. In Unicode parlance, each of those 'things' (letters) are known as 'code points'. Unicode separates the characters' meaning from their representation.For historical reasons, the most common … -
Python, Unicode and UnicodeDecodeError
Unicode and Encodings OK, let's take a step away from text for a moment. I want you to think of a number between one and ten. Got one? Great - now, grab a pen and paper, and write it down.What number did you think of? Well, I thought of the number six. And when I wrote it down, it looks like this: Of course, if I were an ancient Roman (or possibly a clockmaker), I could have written this: They all mean the same thing - the number six. But we've written them in different ways. In other words, we've 'encoded' our idea of the number six in our head in three different ways - three different encodings.The separation of the idea of 'the number six' from its actual representation is basically all Unicode is. The Unicode Character set (UCS) defines a set of things (loosely, a set of letters) that we can represent. How we represent each of those letters is called an encoding. There's only one Unicode, but there are many encodings. In Unicode parlance, each of those 'things' (letters) are known as 'code points'. Unicode separates the characters' meaning from their representation.For historical reasons, the most common … -
Python, Unicode and UnicodeDecodeError
Unicode and Encodings OK, let's take a step away from text for a moment. I want you to think of a number between one and ten. Got one? Great - now, grab a pen and paper, and write it down.What number did you think of? Well, I thought of the number six. And when I wrote it down, it looks like this: Of course, if I were an ancient Roman (or possibly a clockmaker), I could have written this: They all mean the same thing - the number six. But we've written them in different ways. In other words, we've 'encoded' our idea of the number six in our head in three different ways - three different encodings.The separation of the idea of 'the number six' from its actual representation is basically all Unicode is. The Unicode Character set (UCS) defines a set of things (loosely, a set of letters) that we can represent. How we represent each of those letters is called an encoding. There's only one Unicode, but there are many encodings. In Unicode parlance, each of those 'things' (letters) are known as 'code points'. Unicode separates the characters' meaning from their representation.For historical reasons, the most common … -
Class-based Views with Django-Baseviews
I've always loved the concept of class-based views because views often become repetitive. There are a lot of common operations in a view that work best when they are defined once and reused. Class inheritance, in my opinion, is the best way to keep views DRY and allow you to focus on what makes each view different. At first, I used to break out pieces of functionality into their own functions in the views.py file. This worked okay, but I had to pass a lot of data around in the arguments and I had to do a lot of imports if I had functions from other app's views that I wanted to use in this app. This quickly became tedious. After seeing django-haystack use class-based views and really loving the way I could customize their behavior for my own project, I decided to start building some base views of my own to build on. While working on new Pegasus News apps, I started building up a set of class-based views that helped me stop repeating everything that the views had in common. Once the base views were in place, the process of creating new views for my apps because a … -
On DjangoCon 2010 and conferences in general
Sunlight Labs is a huge fan of Django. We use it in a majority of the projects we produce here and have released the source of numerous applications. So a few weeks ago a bunch of us eagerly packed our bags and flew out to Portland, OR for DjangoCon 2010. DjangoCon: The Good Parts Rethinking the Reusable Application Paradigm Alex Gaynor's talk "Rethinking the Reusable Application Paradigm", though a whirlwind of information, was one of the best of the conference. Reusable applications have long been a selling point of Django, but it is often quite difficult to use apps in any situation that would require the most basic of customization. Alex's talk covered the things that most frequently prevent apps from being reused and possible solutions to get around the limitations. The ideas he offered were both practical and enjoyably complex. I look forward to implementing some of them in our applications. Lightning Talks As always, the lightning talks were a highlight of the conference. It's a chance for people to show off novel solutions to problems or propose their crazy ideas. Some of the best included: Eric Holscher demoed Read The Docs, a documentation creation and hosting service. If … -
Django-taggit, le tag est mort, vive le tag ..
J'ai déjà fait, il y en fait 11 mois, un billet de la django app du mois sur une app de tag, django-tagging. Lorsque je l'ai testé, django-tagging était à la version 0.3. Aujourd'hui, elle est version 0.3.1. Et les derniers commit remonte à janvier 2010 ( ce sont ceux ayant aboutis à la ... -
JOINs via denormalization for NoSQL coders, Part 2: Materialized views
In part 1 we discussed a workaround for JOINs on non-relational databases using denormalization in cases for which the denormalized properties of the to-one side don't change. In this post we'll show one way to handle JOINs for mutable properties of the to-one side i.e. properties of users. Let's summarize our current situation: We have users (the to-one side) and their photos (the to-many side) Photos contain their users' gender in order to use it in queries which would need JOINs otherwise It's obvious that a solution for the problem of mutable properties on the to-one side has to keep denormalized properties up to date i.e. each time the user changes his/her gender (or more likely her hair color ;) we have to go through all of the user's photos and update the photos' denormalized gender. It is clear that we get into problems here if a user has thousands of photos to update because such an update would take too long. We need a scalable way to deal with such updates. Background tasks to the rescue One way to solve the update-problem is to start a background task each time a user changes his/her gender. It's clear that this … -
Autobench Cloud
After seeing Nicholas Piël benchmark a bunch of Python web servers, I was just itching to try some different configurations. So, I thought I would try to copy his autobench setup to do some testing of my own. The problem is, where do you get several computers to run the benchmark? And having to recompile httperf on several machines would be a lot of work. Amazon EC2 and Ubuntu to the rescue! The key was that I wanted to be able to launch several instances at once and only have to connect to one of them to control them all. I thought I would have to build a custom AMI because I only wanted to do the custom configuration once. Turns out, I was wrong. Ubuntu provides ready-to-go images that can be instantiated with a custom script. So, the first thing to do is pick the AMI you want to use from the link above. I went with us-east-1, 32bit, and EBS root so that I could use micro instances. You can choose instance root if you want to use small instances. Next, make sure you have a security group (I created a new one called Autobench) that permits both … -
Autobench Cloud
After seeing Nicholas Piël benchmark a bunch of Python web servers, I was just itching to try some different configurations. So, I thought I would try to copy his autobench setup to do some testing of my own. The problem is, where do you get several computers to run the benchmark? And having to recompile httperf on several machines would be a lot of work. Amazon EC2 and Ubuntu to the rescue! The key was that I wanted to be able to launch several instances at once and only have to connect to one of them to control them all. I thought I would have to build a custom AMI because I only wanted to do the custom configuration once. Turns out, I was wrong. Ubuntu provides ready-to-go images that can be instantiated with a custom script. So, the first thing to do is pick the AMI you want to use from the link above. I went with us-east-1, 32bit, and EBS root so that I could use micro instances. You can choose instance root if you want to use small instances. Next, make sure you have a security group (I created a new one called Autobench) that permits both … -
Django Patterns: View Decorators
Problem and Analysis Sites often have many views that operate with a similar set of assumptions. Maybe there are entire areas that the user must be logged-in to visit, or there is some repetitive boilerplate functionality that a group of views shares like being rate-limited. Bolting on "login required" or "rate limiting" functionality can be a bit repetitive since it often requires "bail out early" logic. Take for example a simple rate-limiting implementation: syntax:python def simple_rate_limiting(request, duration=10): # grab the end-user's IP address remote_addr = request.META.get('REMOTE_ADDR') # create a cache key combining IP and url requested key = '%s.%s' % (remote_addr, request.get_full_path()) # if the key exists then the user has been here recently if cache.get(key): return True else: cache.set(key, 1, duration) return False def rate_limited_view(request): if simple_rate_limiting(request): return HttpResponseForbidden('Slow down!') # normal view logic continues here # There is nothing particularly bad about this implementation - we are checking for a condition based on the request and if necessary bailing out early. The problem starts to appear when additional "common" components get added to the mix, such as: loading an object based on a url param checking for auth adding something to the template context/response And now for a … -
DjangoCon 2010 report I
-
JOINs via denormalization for NoSQL coders, Part 1: Intro
Non-relational databases like App Engine or MongoDB natively don't support operations like JOINs because they don't scale. However in some situations there just exists the need to use such operations. This is the first part of a series presenting one way to handle JOINs (at first in the to-one direction) on NoSQL databases while maintaining scalability. Additionally you'll learn some useful NoSQL coding techniques throughout this series. Why would I need JOINs? Let's take the example of users and their photos. Here users represent the to-one side and photos the to-many side: It's common that users have the possibility to search for pictures of other users. While searching for photos of a specific user is easy to achieve on non-relational databases via Photo.objects.filter(user=some_user) for example, searching for photos of users given some specification like Photo.objects.filter(user__gender='female', popularity='high') isn't equally simple to achieve. Obviously we need JOINs here (which aren't supported on NoSQL databases) because we span a filter over two models. A straightforward solution to this problem is to get all female users first and then to get all popular photos whose user property points to these users: user_pks = User.objects.filter(gender='female').values('pk') female_user_photos = Photo.objects.filter(user__in=user_pks, popularity='high') Getting only the primary keys of … -
Looking for a disciplined Software Developer
At 2degrees we're looking for an experienced and disciplined Software Developer to work on the Django-based back-end of our Web site, as well as implement AJAX-based functionality from time to time.Prior Python, Django or JavaScript experience is desirable but not strictly necessary as we are looking to hire the best Software Developer we find regardless of the technologies they've used in the past.Learn more about this position and contact us if you're interested! -
Configure the output of the Django development server
I recently opened up my home dev server for a closed, friends and family alpha launch of my new commerce/community site Wantbox.com. Now that people besides me are hitting the server, I wanted to see client IP addresses in the dev server output. Current output: [19/Sep/2010 19:23:39] "GET / HTTP/1.1" 200 2555 [19/Sep/2010 19:23:39] "GET /static/media/css/site.css HTTP/1.1" 200 14311 [19/Sep/2010 19:23:40] "GET /static/media/js/site.js HTTP/1.1" 200 620 [19/Sep/2010 19:23:40] "GET /static/media/img/logo-home.gif HTTP/1.1" 200 4963 Desired output: [19/Sep/2010 19:23:39] 166.137.139.17 "GET / HTTP/1.1" 200 2555 [19/Sep/2010 19:23:39] 166.137.139.17 "GET /static/media/css/site.css HTTP/1.1" 200 14311 [19/Sep/2010 19:23:40] 166.137.139.17 "GET /static/media/js/site.js HTTP/1.1" 200 620 [19/Sep/2010 19:23:40] 166.137.139.17 "GET /static/media/img/logo-home.gif HTTP/1.1" 200 4963 I wasn’t able to track down any built-in configuration options to runserver, but thanks to the sage advice of “Python/Django evangelist” Peter (most recently, the creator of The Prince of Pinot) I got this workaround (applies to Django 1.2.1): open django/core/servers/basehttp.py change line 614 from: msg = "[%s] %s\n" % (self.log_date_time_string(), format % args) to: msg = "[%s] %s %s\n" % (self.log_date_time_string(), self.client_address[0], format % args I’m not crazy about messing with the core Django code, but I found no other way to get the output I wanted short of running a “real” … -
Multiple cache backends in Django
Out of the box, Django’s cache framework includes different cache back-ends (including the venerable memcached) and granularities (site-wide, view-specific, etc.). How could you improve on this awesomeness? One way is to use multiple back-ends. This might be desirable if your application needs a vanilla-flavored memcache for the site, and a second cache for a data [...] -
Afficher la version de django
un petit mémo tout con, mais qui peut-être utile. Il peut arriver d'avoir besoin d'afficher la version de django utilisé pour un projet précis. Comment faire ? La fonction get_version() du __init__ de django est la pour ça. Un petit from django import get_version est le tour est donc joué. -
Django and AJAX image uploads
Note: this is a repost from my blog. You can find the original post here. This is my first post to the Mozilla WebDev blog. Woot, exciting! Table of contents: Demo Summary Server side (Django) Model Form View Generating the thumbnail with PIL Client side Graceful degradation Demo Screencast Screenshots: The upload form, empty and [...] -
Django and AJAX image uploads
Note: this is a repost from my blog. You can find the original post here. This is my first post to the Mozilla WebDev blog. Woot, exciting! Table of contents: Demo Summary Server side (Django) Model Form View Generating the thumbnail with PIL Client side Graceful degradation Demo Screencast Screenshots: The upload form, empty and [...] -
Going Green
There are so many ways to serve up Django and other WSGI apps. I’ve used nginx and uWSGI (thanks to a great blog post by Zachary Voase), IIS and isapi-wsgi, Apache and mod_wsgi, and even CherryPy as a development “runserver” replacement. I’ve recently started hearing more and more about asynchronous servers, lightweight threads, and greenlets and such. I also came across the Green Unicorn project that, though not very speedy with its default worker class, has recently integrated gevent to make it a very attractive offering. This post describes how I got a Django project up and running on WebFaction (affiliate link) using Gunicorn and gevent. It was quite fun! One of the advantages of using this method on WebFaction in particular is that they already have nginx running in front of all your apps. It bothered me, when using uWSGI, that I had to have an additional nginx instance running, or having to run full blown Apache to use mod_wsgi. Simpler is better and, even though I opted to compile some things, Gunicorn seemed simpler. Especially when it came to finally running the Django project. Install Python As you’ll see with most of this, I like to play with … -
Google Analytics referring sites and https
The problem: recently a client reported the he does not see another site he owns in the list of referring sites in his Google Analytics account(for his main website) but was absolutely sure that he recieves trafic from this website. The research and the reason: at first I thought that the problem is cause by [...] -
Going Green
There are so many ways to serve up Django and other WSGI apps. I’ve used nginx and uWSGI (thanks to a great blog post by Zachary Voase), IIS and isapi-wsgi, Apache and mod_wsgi, and even CherryPy as a development “runserver” replacement. I’ve recently started hearing more and more about asynchronous servers, lightweight threads, and greenlets and such. I also came across the Green Unicorn project that, though not very speedy with its default worker class, has recently integrated gevent to make it a very attractive offering. This post describes how I got a Django project up and running on WebFaction (affiliate link) using Gunicorn and gevent. It was quite fun! One of the advantages of using this method on WebFaction in particular is that they already have nginx running in front of all your apps. It bothered me, when using uWSGI, that I had to have an additional nginx instance running, or having to run full blown Apache to use mod_wsgi. Simpler is better and, even though I opted to compile some things, Gunicorn seemed simpler. Especially when it came to finally running the Django project. Install Python As you’ll see with most of this, I like to play with … -
Django Patterns: Pluggable Backends
As the first installment in a series on common patterns in Django development, I'd like to discuss the Pluggable Backend pattern. The pattern addresses the common problem of providing extensible support for multiple implementations of a lower level function, be it caching, database querying, etc. -
Django Patterns: Pluggable Backends
As the first installment in a series on common patterns in Django development, I'd like to discuss the Pluggable Backend pattern. The pattern addresses the common problem of providing extensible support for multiple implementations of a lower-level function, for example caching, database querying, etc. Problem The use of this pattern often coincides with places where the application needs to be configurable to use one of many possible solutions, as in the case of database engine support. Consider the following: The application needs to support Backend A and Backend B but if you look closely at the methods exposed there are some discrepancies: Backend A has slightly more verbose method names than Backend B Backend B does not accept a default value on the get() method In Django we see this pattern all over the place: django.contrib.auth django.contrib.messages django.contrib.sessions django.core.cache django.core.files.storage django.core.mail django.core.serializers django.db Analysis Here is a first stab at getting our Application to talk to backend A and B: class ApplicationBackend(object): def __init__(self, backend): # here we are self.backend = backend def get(self, key, default=None): if isinstance(self.backend, BackendA): return self.backend.get_data(key, default) elif isinstance(self.backend, BackendB): try: return self.backend.get(key) except BackendB.KeyError: return default def set(self, key, value): ... etc ... Notice … -
Django Patterns: Pluggable Backends
As the first installment in a series on common patterns in Django development, I'd like to discuss the Pluggable Backend pattern. The pattern addresses the common problem of providing extensible support for multiple implementations of a lower-level function, for example caching, database querying, etc. Problem The use of this pattern often coincides with places where the application needs to be configurable to use one of many possible solutions, as in the case of database engine support. Consider the following: The application needs to support Backend A and Backend B but if you look closely at the methods exposed there are some discrepancies: Backend A has slightly more verbose method names than Backend B Backend B does not accept a default value on the get() method In Django we see this pattern all over the place: django.contrib.auth django.contrib.messages django.contrib.sessions django.core.cache django.core.files.storage django.core.mail django.core.serializers django.db Analysis Here is a first stab at getting our Application to talk to backend A and B: class ApplicationBackend(object): def __init__(self, backend): # here we are self.backend = backend def get(self, key, default=None): if isinstance(self.backend, BackendA): return self.backend.get_data(key, default) elif isinstance(self.backend, BackendB): try: return self.backend.get(key) except BackendB.KeyError: return default def set(self, key, value): ... etc ... Notice …