Middleware w Django

Middleware w Django to niskopoziomowy system "wtyczek" wpływających na dane przesyłane do i z aplikacji Django. Obrazując middleware to kod, który będzie automatycznie wykonywany przed/po wykonaniu widoku, przed wysłaniem odpowiedzi do klienta (przeglądarki) itp. Django posiada zestaw gotowych skryptów middleware opisanych w jego dokumentacji, lecz oprócz nich możemy również tworzyć własne skrypty middleware.

Obsługa Middleware

W settings.py mamy kod w postaci:
MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.doc.XViewMiddleware',)
Domyślna lista aktywnych skryptów middleware, do której możemy dopisać własne, np.:
MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.doc.XViewMiddleware',
    'stats.statsMiddleware.statsMiddleware',)
stats.statsMiddleware.statsMiddleware odpowiada NAZWA_APLIKACJI.NAZWA_PLIKU.NAZWA_KLASY. W powyższym przykładzie mam aplikację-katalog "stats", a w nim plik statsMiddleware.py o kodzie:
from stats.models import *
from datetime import datetime

class statsMiddleware(object):
	def process_request(self, request):
		try:
			today = str(datetime.today())[:10]
			unique = Stat.objects.filter(ip = request.META['REMOTE_ADDR'], date = today).count()
			if unique < 1:
				if not request.META.has_key('HTTP_REFERER'):
					request.META['HTTP_REFERER'] = ''
				s = Stat(ip = request.META['REMOTE_ADDR'], referer = request.META['HTTP_REFERER'], date = today)
				s.save()
		except:
			pass
Powyższy skrypt middleware wykona się dla każdego żądania, a jego celem jest dodanie wpisu do statystyk odwiedzin (dane IP zapisane raz w danym dniu).

API Middleware

Skrypty middleware moga być wykonywane w określonych okolicznościach - zależnie od zastosowanej metody middleware:
  • process_request(self, request) - Ta metoda wykonywana jest przy każdym żądaniu zanim Django określi widok do wykonania. Powinna zwrócić None (Django będzie kontynuować wykonywanie kodu, widoku) lub HttpResponse - zwrócony zostanie podany obiekt HttpResponse.
  • process_view(self, request, view_func, view_args, view_kwargs) - "view_func" to obiekt funkcji widoku jaki ma być wykonany, "view_arg" i "view_kwargs" zawierają argumenty jakie będą przekazane do widoku. Metoda ta zostanie wykonana przed samym wykonaniem widoku. Powinna zwrócić None (Django będzie kontynuować wykonywanie kodu, widoku) lub HttpResponse - zwrócony zostanie podany obiekt HttpResponse.
  • process_response(self, request, response) - metoda ta musi zwrócić obiekt HttpResponse, czy to oryginalną odpowiedź "response" lub też inną określoną przez programistę.
  • process_exception(self, request, exception) - "exception" to obiekt Exception. Metoda ta zostanie wykonana w przypadku wystąpienia wyjątku w widoku. Powinna zwrócić None (wtedy do przeglądarki zwrócony zostanie standardowy widok dla wyjątków) lub inny obiekt HttpResponse określony przez programistę.
RkBlog

Django, 14 July 2008, Piotr Maliński

Comment article
RkBlog main page Search RSS Contact