DjangoFoo Hosting Updates

Posted: August 18th, 2010 | Author: Davo | Filed under: Django | 4 Comments »

Just a quick entry to let you know the following updates are now available on our
DjangoFoo hosting platform

  • Upgraded mod_wsgi to 3.3
  • New 750GB of backup server available, with weekly backups.

RequestContext direct_to_template, TEMPLATE_CONTEXT_PROCESSORS

Posted: August 5th, 2010 | Author: Davo | Filed under: Django | Tags: , | No Comments »

If you are wondering why you can’t use {{ request }} in your templates while using
direct_to_template then you probably forgot to edit your TEMPLATE_CONTEXT_PROCESSORS in settings.py

The default TEMPLATE_CONTEXT_PROCESSORS is without the django.core.context_processors.request

TEMPLATE_CONTEXT_PROCESSORS = (
      "django.contrib.auth.context_processors.auth",
      "django.core.context_processors.request",
      "django.core.context_processors.debug",
      "django.core.context_processors.i18n",
      "django.core.context_processors.media",
      "django.contrib.messages.context_processors.messages",
)

Hope this works for you.


Session Key Change On Login

Posted: July 3rd, 2010 | Author: Arif Harbott | Filed under: Django | Tags: , | No Comments »

If you use the request.session.session_key for an anonymous user e.g. to store shopping cart information, and then use django.contrib.auth login be aware that the session key will change. This tends to catch out new Django developers.


Get SESSION id/key (session_key)

Posted: June 23rd, 2010 | Author: Davo | Filed under: Django | Tags: | 4 Comments »

You can easily grab the session key/id from the request object

     print request.session.session_key

Autoreload/Restart modwsgi on source change

Posted: June 20th, 2010 | Author: Davo | Filed under: Django | Tags: | 4 Comments »

When developing with Django’s DEV server it has a very nice feature, the auto-reload.
That is, every time you make changes to a file, the server is automatically restarted.

We can have the same with Apache/modwsgi, all you need to do is the following:
pre requirements: Linux, python, apache, modwsgi running with WSGIDaemonProcess

1) Find the site-packages of your current python

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"

2) monitor.py , copy this file inside your site-packages directory

import os
import sys
import time
import signal
import threading
import atexit
import Queue

_interval = 1.0
_times = {}
_files = []

_running = False
_queue = Queue.Queue()
_lock = threading.Lock()

def _restart(path):
    _queue.put(True)
    prefix = 'monitor (pid=%d):' % os.getpid()
    print >> sys.stderr, '%s Change detected to \'%s\'.' % (prefix, path)
    print >> sys.stderr, '%s Triggering process restart.' % prefix
    os.kill(os.getpid(), signal.SIGINT)

def _modified(path):
    try:
        # If path doesn't denote a file and were previously
        # tracking it, then it has been removed or the file type
        # has changed so force a restart. If not previously
        # tracking the file then we can ignore it as probably
        # pseudo reference such as when file extracted from a
        # collection of modules contained in a zip file.

        if not os.path.isfile(path):
            return path in _times

        # Check for when file last modified.

        mtime = os.stat(path).st_mtime
        if path not in _times:
            _times[path] = mtime

        # Force restart when modification time has changed, even
        # if time now older, as that could indicate older file
        # has been restored.

        if mtime != _times[path]:
            return True
    except:
        # If any exception occured, likely that file has been
        # been removed just before stat(), so force a restart.

        return True

    return False

def _monitor():
    while 1:
        # Check modification times on all files in sys.modules.

        for module in sys.modules.values():
            if not hasattr(module, '__file__'):
                continue
            path = getattr(module, '__file__')
            if not path:
                continue
            if os.path.splitext(path)[1] in ['.pyc', '.pyo', '.pyd']:
                path = path[:-1]
            if _modified(path):
                return _restart(path)

        # Check modification times on files which have
        # specifically been registered for monitoring.

        for path in _files:
            if _modified(path):
                return _restart(path)

        # Go to sleep for specified interval.

        try:
            return _queue.get(timeout=_interval)
        except:
            pass

_thread = threading.Thread(target=_monitor)
_thread.setDaemon(True)

def _exiting():
    try:
        _queue.put(True)
    except:
        pass
    _thread.join()

atexit.register(_exiting)

def track(path):
    if not path in _files:
        _files.append(path)

def start(interval=1.0):
    global _interval
    if interval < _interval:
        _interval = interval

    global _running
    _lock.acquire()
    if not _running:
        prefix = 'monitor (pid=%d):' % os.getpid()
        print >> sys.stderr, '%s Starting change monitor.' % prefix
        _running = True
        _thread.start()
    _lock.release()

3) Finally edit your application WSGI file and add the following before your application=django.core.handlers.wsgi.WSGIHandler():

...
import monitor

monitor.start(interval=5.0) # check every 5 seconds

for root,dirs,files in os.walk('/some/folder/where/your/app/is'):
        for x in files:
            if os.path.splitext(x)[1].lower() == '.py': # only .py files please.
                monitor.track(root + x)
...

original code is at http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Monitoring_For_Code_Changes