HTTP Status Codes Site
4During the development of Simple Site Checker I realised that it would be useful for test purposes if there is a website returning all possible HTTP status codes. Thanks to Google App Engine and webapp2 framework building such website was a piece of cake.
The site can be found at http://httpstatuscodes.appspot.com.
The home page provides a list of all HTTP status codes and their names and if you want to get an HTTP response with a specific status code just add the code after the slash, example:
http://httpstatuscodes.appspot.com/200 – returns 200 OK
http://httpstatuscodes.appspot.com/500 – returns 500 Internal Server Error
Also at the end of each page is located the URL of the HTTP protocol Status Codes Definitions with detailed explanation for each one of them.
The website code is publicly available in github at HTTP Status Codes Site.
If you find it useful feel free to comment and/or share it.
Simple Site Checker
2… a command line tool to monitor your sitemap links
I was thinking to make such tool for a while and fortunately I found some time so here it is.
Simple Site Checker is a command line tool that allows you to run a check over the links in you XML sitemap.
How it works: The script requires a single attribute – a URL or relative/absolute path to xml-sitemap. It loads the XML, reads all loc-tags in it and start checking the links in them one by one.
By default you will see no output unless there is an error – the script is unable to load the sitemap or any link check fails.
Using the verbosity argument you can control the output, if you need more detailed information like elapsed time, checked links etc.
You can run this script through a cron-like tool and get an e-mail in case of error.
I will appreciate any user input and ideas so feel free to comment.
Faking attributes in Python classes…
3… or how to imitate dynamic properties in a class object
Preface: When you have connections between your application and other systems frequently the data is not in the most useful form for your needs. If you have an API it is awesome but sometimes it just does not act the way you want and your code quickly becomes a series of repeating API calls like api.get_product_property(product_id, property).
Of course it will be easier if you can use objects to represent the data in you code so you can create something like a proxy class to this API:
class Product(object):
def __init__(self, product_id):
self.id = product_id
@property
def name(self):
return api_obj.get_product_property(self.id, 'name')
@property
def price(self):
return api_obj.get_product_property(self.id, 'price')
#usage
product = Product(product_id)
print product.name
In my opinion it is cleaner, more pretty and more useful than the direct API calls. But still there is something not quite right.
Problem: Your model have not two but twenty properties. Defining 20 method makes the code look not that good. Not to mention that amending the code every time when you need a new property is quite boring. So is there a better way?
As I mention at the end of Connecting Django Models with outer applications if you have a class that plays the role of a proxy to another API or other data it may be easier to overwrite the __getattr__ method.
Solution:
class Product(object):
def __init__(self, product_id):
self.id = product_id
def __getattr__(self, key):
return api_obj.get_product_property(self.id, key)
#usage
product = Product(product_id)
print product.name
Now you can directly use the product properties as attribute names of the Product class. Depending from the way that the API works it would be good to raise AttributeError if there is no such property for the product.
Software for business
0I am starting a new blog. The reason is that I want to keep this one more technically oriented while the other will be more business and customers oriented. Its name is Software for business and the idea is to show to the business in less technical details how the modern IT technologies like CRM & ERP systems, web sites, e-commerce solutions, online marketing and so on can help their business.
If you find the topic interesting feel free to join.
Connecting Django Models with outer applications
3Preface: Sometimes, parts of the data that you have to display in your application reside out of the Django models. Simple example for this is the following case – the client requires that you build them a webshop but they already have CRM solution that holds their products info. Of course they provide you with a mechanism to read this data from their CRM.
Specialty: The problem is that the data in their CRM does not hold some of the product information that you need. For instance it misses SEO-friendly description and product image. So you will have to set up a model at your side and store these images there. It is easy to join them, the only thing that you will need is a simple unique key for every product.
Solution: Here we use the product_id field to make the connection between the CRM data and the Django model.
# in models.py
class Product(models.Model):
product_id = models.IntegerField(_('Original Product'),
unique=True)
description = models.TextField(_('SEO-friendly Description'),
blank=True)
pod_image = FilerImageField(verbose_name=_('Product Image'),
blank=True, null=True)
@property
def name(self):
return crm_api.get_product_name(self.product_id)
# in forms.py
class ProductForm(forms.ModelForm):
name = forms.CharField(required=False,
widget=forms.TextInput(attrs={
'readonly': True,
'style': 'border: none'}))
class Meta:
model = Product
widgets = {
'product_id': forms.Select(),
}
def __init__(self, *args, **kwargs):
super(ProductForm, self).__init__(*args, **kwargs)
self.fields['product_id'].widget.choices = crm_api.get_product_choices()
if self.instance.id:
self.fields['name'].initial = self.instance.name
The form here should be used in the admin(add/edit) page of the model. We define that the product_id field will use the select widget and we use a method that connect to the CRM and returns the product choices list.
The “self.instance.id” check is used to fill the name field for product that are already saved.
Final words: This is a very simple example but its idea is to show the basic way to connect your models with another app. I strongly recommend you to use caching if your CRM data is not modified very often in order to save some bandwidth and to speed up your application.
Also if you have multiple field it may be better to overwrite the __getattr__ method instead of defining separate one for each property that you need to pull from the outer application.
P.S. Thanks to Miga for the code error report.
Python os.stat times are OS specific …
0… no problem cause we have stat_float_times
Preface: recently I downloaded PyTDDMon on my office station and what a surprise – the files changes did not affect on the monitor. So I run a quick debug to check what is going on: the monitor was working running a check on every 5 seconds as documented but it does not refresh on file changes.
Problem: it appeared that the hashing algorithm always returns the same value no matter whether the files are changed or not. The calculation is based on three factors: file path, file size and time of last modification. I was changing a single file so the problem was in the last one. Another quick check and another surprise – os.stat(filename).st_mtime returns different value after the files is changed but the total hash stays unchanged. The problem was caused from st_mtime returning floating point value instead of integer.
Solution: Unfortunately the os.stat results appeared to be OS specific. Fortunately the type of the returned result is configurable. Calling os.stat_float_times(False) in the main module force it to return integer values.
Final words: these OS/version/settings things can always surprise you. And most of the time it is not a pleasant surprise. Unfortunately testing the code on hundred of different workstations is not an option. But this is one of the good sides of the open source software. You download it, test it, debug it and have fun.
Also special thanks to Olof(the man behind the pytddmon concept) for the tool, the quick response to my messages and for putting my fix so fast in the repo. I hope that this has saved someone nerves )
P.S. If you are using Python and like TDD – PYTDDMON is the right tool for you.
Django CMS Plugins with selectable template …
8… or how to reuse your plugins inside sections with different design
Problem: Frequently on the websites I am developing I need to display same set of data in several different ways. For example if I have a news box that needs to appear in different sections of the website e.i. in sidebar, main content etc. Using Django CMS plugins make this quite easy.
For simplicity we will take the following case. An image/text tuple with two layout variations – image on left of text and image on right.

Same data but different layout. All you need to do is just to allow your users to change the plugin template according to their needs. If you don’t have experience with Django CMS Plugins I advice you to check how to create custom Django CMS Plugins before you continue with solution.
Solution: First you will have to create a tuple holding your templates(and their human readable names) and add a field that will hold the chosen template to the plugin model.
#models.py
PLUGIN_TEMPLATES = (
('image_on_left.html', 'Image on left'),
('image_on_right.html', 'Image on right'),
)
class SamplePlugin(CMSPlugin):
# your plugin properties here
template = models.CharField('Template', max_length=255,
choices = PLUGIN_TEMPLATES)
Now it is time to tweak the template render method too:
#cms_plugins.py
class CMSSamplePlugin(CMSPluginBase):
model = SamplePlugin
name = 'Sample plugin'
render_template = PLUGIN_TEMPLATES[0][0]
def render(self, context, instance, placeholder):
if instance and instance.template:
self.render_template = instance.template
#your stuff here
return context
Final words: Yep, this is all. Simple isn’t it? It is amazing how sometimes such small things are so useful. If you are having bigger difference in the layout of your templates you will probably have to put a little more stuff in the context that some of your templates may not need but it is OK. Feel free to comment and if you are using this “trick” please add your use case – it will be interesting to see in how many different cases this works.
Neil Gaiman’s Anansi Boys…
0… an unexpected gift and unexpected dedication
YOU KNOW HOW IT IS. You pick up a book, flip to the dedication, and find that, once again, the author has dedicated a book to someone else and not you.
Not this time.
Because we haven’t yet met/have only a glancing acquaintance/are just crazy about each other/haven’t seen each other in much too long/are in some way related/will never meet, but will, I trust, despite that, always think fondly of each other…
This one’s for you.
With you know what, and you probably know why.”
This is how Neil Gaiman‘s Anansi Boys starts.
About a week ago I spent few days in Greece. One day we were sitting under the shadow of a near bar when something grabbed my attention. Next to the bar there was a book shelf with something special on it:

It was really strange to go in a foreign country, in unknown place and there a few meters away from me standing out with its black cover to see a book of one of my favourite authors. So I just took my camera, go there and take a shot on it.
The bartender asked me what am I shooting so I explained to him that it was a surprise for me to see that book. He took it as he was seeing it for a first time in his life, took a brief look at it and asked me whether I have read it. I said that unfortunately I am not. Then he took another look at the book and gave it to me as a gift. I took and open it and… it was starting with the dedication from the top of this post.
Coincidence? Maybe… or maybe not.
It is always a pleasure for me to discover pieces of art, no matter whether I am travelling or not, no matter is it an ancient castle or a book, it is great.
I haven’t still finished the book but it looks amazing. I really recommend it as any other Gaiman’s book. Hopefully I’ll meet Neil one day till than(and after) I’ll keep reading.
So if you are reading this go travel, or read books, or both. Have fun and share your experience.
Language redirects for multilingual sites with Django CMS …
9… or how to avoid duplicate content by keeping the current language in the URL
Preface: Earlier this year I posted about Django CMS 2.2 features that I want to see and one of the things mentioned there was that once you have chosen the language of the site there is no matter whether you will open “/my_page/” or “/en/my_page/” – it just shows the same content. The problem is that this can be considered both duplicate and inconsistent content.
Duplicate because you see the same content with and without the language code in the URL and inconsistent because for the same URL you can get different language versions i.e. different content.
Solution: This can be easy fixed by using a custom middleware that will redirect the URL that does not contain language code. In my case the middleware is stored in “middleware/URLMiddlewares.py”(the path is relative to my project root directory) and contains the following code.
from cms.middleware.multilingual import MultilingualURLMiddleware
from django.conf import settings
from django.http import HttpResponseRedirect
from django.utils import translation
class CustomMultilingualURLMiddleware(MultilingualURLMiddleware):
def process_request(self, request):
lang_path = request.path.split('/')[1]
if lang_path in settings.URLS_WITHOUT_LANGUAGE_REDIRECT:
return None
language = self.get_language_from_request(request)
translation.activate(language)
request.LANGUAGE_CODE = language
if lang_path == '':
return HttpResponseRedirect('/%s/' % language)
if len([z for z in settings.LANGUAGES if z[0] == lang_path]) == 0:
return HttpResponseRedirect('/%s%s' % (language, request.path))
Now a little explanation on what happens in this middleware.
Note: If you are not familiar with how middlewares work go and check Django Middlewares.
Back to the code. First we split the URL by ‘/’ and take the second element(this is where our language code should be) and store in lang_path(8).
URLS_WITHOUT_LANGUAGE_REDIRECT is just a list of URLs that should not be redirected, if lang_path matches any of the URLs we return None i.e. the request is not changed(9-10). This is used for sections of the site that are not language specific for example media stuff.
Then we get language based on the request(11-13).
If lang_path is empty then the user has requested the home page and we redirect him to the correct language version of it(14-15).
If lang_path does not match any of the declared languages this mean that the language code is missing from the URL and the user is redirected to the correct language version of this page(16-17).
To make the middleware above to work you have to update your settings.py.
First add the middleware to your MIDDLEWARE_CLASSES – in my case the path is ‘middleware.URLMiddlewares.CustomMultilingualURLMiddleware’.
Second add URLS_WITHOUT_LANGUAGE_REDIRECT list and place there the URLs that should not be redirected, example:
URLS_WITHOUT_LANGUAGE_REDIRECT = [
'css',
'js',
]
Specialties: If the language code is not in the URL and there is no language cookie set your browser settings will be used to determine your preferred language. Unfortunately most of the users do not know about this option and it often stays set to its default value. If you want this setting to be ignored just add the following code after line 10 in the middleware above:
if request.META.has_key('HTTP_ACCEPT_LANGUAGE'):
del request.META['HTTP_ACCEPT_LANGUAGE']
It removed the HTTP_ACCEPT_LANGUAGE header sent from the browser and Django uses the language set in its settings ad default.
URLS_WITHOUT_LANGUAGE_REDIRECT is extremely useful if you are developing using the built in dev server and serve the media files trough it. But once you put your website on production I strongly encourage you to serve these files directly by the web server instead of using Django static serve.
Final words: In Django 1.4 there will be big changes about multilingual URLs but till then you can use this code will improve your website SEO. Any ideas of improvement will be appreciated.
Retrieving Google Analytics data with Python…
8… or how to pull data about page visits instead of implementing custom counter
Preface: OK, so you have a website, right? And you are using Google Analytics to track your page views, visitors and so on?(If not you should reconsider to start using it. It is awesome, free and have lost of features as custom segments, map overlay, AdSense integration and many more.)
So you know how many people have visited your each page of your website, the bounce rate, the average time they spend on the page etc. And this data is only for you or for a certain amount whom you have granted access.

Problem: But what happens if one day you decided to show a public statistic about visitors on your website. For example: How many people have opened the “Product X” page?
Of course you can add a custom counter that increases the views each time when the page is open. Developed, tested and deployed in no time. Everyone is happy until one day someones cat took a nap on his keyboard and “accidentally” kept the F5 button pressed for an hour. The result is simple – one of you pages has 100 times more visits than the other. OK, you can fix this with adding cookies, IP tracking etc. But all this is reinventing the wheel. You already have all this data in your Google Analytics, the only thing you have to do is to stretch hand and take it.
Solution: In our case “the hand” will be an HTTP request via the Google Data API. First you will need to install the Python version of the API:
sudo easy_install gdata
Once you have the API installed you have to build a client and authenticate:
SOURCE_APP_NAME = 'The-name-of-you-app'
my_client = gdata.analytics.client.AnalyticsClient(source=SOURCE_APP_NAME)
my_client.client_login(
'USERNAME',
'PASSWORD',
source=SOURCE_APP_NAME,
service=my_client.auth_service,
account_type = 'GOOGLE',
)
token = my_client.auth_token
SOURCE_APP_NAME is the name of the application that makes the request. You can set it to anything you like.
After you build the client(2) you must authenticate using your Google account(3-9). If you have both Google and Google APPs account with the same username be sure to provide the correct account type(8).
Now you have authenticated and it is time to build the request. Obviously you want to filter the data according some rules. The easiest way is to use the Data Feed Query Explorer to build your filter and test it and then to port it to the code. Here is an example how to get the data about the page views for specific URL for a single month(remember to update the PROFILE_ID according to your profile).
account_query = gdata.analytics.client.AccountFeedQuery()
data_query = gdata.analytics.client.DataFeedQuery({
'ids': 'ga:PROFILE_ID',
'dimensions': '', #ga:source,ga:medium
'metrics': 'ga:pageviews',
'filters': 'ga:pagePath==/my_url_comes_here/',
'start-date': '2011-08-06',
'end-date': '2011-09-06',
'prettyprint': 'true',
})
feed = my_client.GetDataFeed(data_query)
result = [(x.name, x.value) for x in feed.entry[0].metric]
Final words: As you see it is relatively easy to get the data from Google but remember that this code makes two request to Google each time it is executed. So you will need to cache the result. The GA data is not real-time so you may automate the process to pull the data(if I remember correctly the data is updated once an hour) and store the results at your side which will really improve the speed. Also have in mind that this is just an example how to use the API instead of pulling the data page by page(as show above) you may pull the results for multiple URLs at once and compute the feed to get your data. It is all in your hands.
You have something to add? Cool I am always open to hear(read) you comments and ideas.
Update: If you are using Django you should consider to use it Memcached to cache these result as shown in Caching websites with Django and Memcached