[Django]-GAE Python optimization: Django filter for language support

2đź‘Ť

âś…

Have you considered switching to standard gettext methods? Gettext is a widely spread approach for internationalization and very well embedded in the Python (and the Django) world.

Some links:

Your template would then look like this:

{% load i18n %}
<h1>{% trans "Header of my Collection" %}</h1>

The files for translations can be generated by manage.py:

manage.py makemessages -l fr

for generating french (fr) messages, for example.

Gettext is quite performant, so I doubt that you will experience a significant slow-down with this approach compared to your storage of the translation table in memcache. And what’s more, it let’s you work with “real” messages instead of abstract dictionary keys, which is, at least in my experience, ways better, if you have to read and understand the code (or if you have to find and change a certain message).

👤Boldewyn

3đź‘Ť

Your initial question is about high cpu usage, the answer i think is simple, with GAE and databases like BigTable (non-relational) the code with entries.count() is expensive and the for entry in entrie too if you have a lot of data.

I think you must have to do a couple of things:

in your utils.py

def GetDictionaryKey(lang, key):
    chache_key = 'dictionary_%s_%s' % (lang, key)
    data = memcache.get(cache_key)
    if not data:
         entry = DictionaryEntries.all().filter("lang = ", lang).filter("value =", key).get()
         if entry:
             data = memcache.add(cache_key, entry.value, 60)
         else:
             data = 'no result for %s' % key
    return data

and in your filter:

 def translate(key, lang):
     return dictionary.GetDictionaryKey(lang, key)

This approach is better because:

  • You don’t make the expensive query of count
  • You respect the MVC pattern, because a filter is part of the Template (View in the pattern) and the method GetDictionaryKey is part of the Controler.

Besides, if you are using django i suggest you slugify your cache_key:

from django.template.defaultfilters import slugify
def GetDictionaryKey(lang, key):
    chache_key = 'dictionary_%s_%s' % (slugify(lang), slugify(key))
    data = memcache.get(cache_key)
    if not data:
         entry = DictionaryEntries.all().filter("lang = ", lang).filter("value =", key).get()
         if entry:
             data = memcache.add(cache_key, entry.value, 60)
         else:
             data = 'no result for %s' % key
    return data
👤diegueus9

Leave a comment