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.
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).
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ę.
- Dodany: 14.07.2008 przez riklaunim