Slide 1

Slide 1 text

DJANGO MIDDLEWARE Creating a custom @andreagrandi Andrea Grandi

Slide 2

Slide 2 text

DJANGO ARCHITECTURE

Slide 3

Slide 3 text

WHY YOU MAY WANT TO CREATE A MIDDLEWARE? • Passing more informations to the views or templates • Altering the data inside a request before it reaches the views/templates • Having a different behaviour in the views/templates, depending on certain conditions (ignoring requests from a particular IP address)

Slide 4

Slide 4 text

THINGS TO KNOW WHEN YOU WRITE A MIDDLEWARE • You need to write a class that just inherits from object • The order in settings.py is important: middlewares are processed from top to bottom during a request and from bottom to top during a response. • You don’t need to implement all the available methods of a middleware. For example you can just implement process_request and process_template_response • If you implement process_request and you decide to return an HttpResponse, all the other middlewares, views etc… will be ignored and only your response will be returned

Slide 5

Slide 5 text

AVAILABLE HOOKS • process_request(request) • process_view( request, view_func, view_args, view_kwargs) • process_exception(request, response) • process_template_response(request, response) • process_response(request, response) (during a request) (during a response)

Slide 6

Slide 6 text

EXAMPLE: BENCHMARKMIDDLEWARE from datetime import datetime class BenchmarkMiddleware(object): def process_request(self, request): request._request_time = datetime.now() def process_template_response(self, request, response): response_time = datetime.now() - request._request_time response.context_data['response_time'] = response_time return response

Slide 7

Slide 7 text

REFERENCES Complete example: https://github.com/andreagrandi/benchmark-middleware-example Documentation: • https://docs.djangoproject.com/en/1.8/topics/http/middleware/ • http://agiliq.com/blog/2015/07/understanding-django-middlewares/ • http://code.runnable.com/UrSGolK00ygpAAAQ/creating-a-custom- middleware-for-python-and-django

Slide 8

Slide 8 text

Thanks! Twitter: @andreagrandi