Extending the request object


August 10, 2007
When working with Django there were a few things that I felt could be shortened just by simply extending the request object. I added a few methods onto it so that some tasks were easier. <br/> <br/>For example: regarding redirects, I was not a big fan of the "HttpResponseRedirect(reverse(url))" syntax. Redirects are a fairly common thing. I did not enjoy having to import two methods and then write such a long line of code. So what I did was add a redirect method onto request. Now all I do is call "request.redirect(url)" and the redirect is performed. The same goes for rendering. I felt that "render_to_response" was a bit too much. Now I simply call "request.render(file)" to render a template. Its simple and powerful. <br/> <br/>These functions make my life a good bit easier. I thought I'd share them with you all. You'll add this in as Middleware. Be aware you must use RequestContext in your app to use this Middleware. <br/> <br/><div class="code"><pre><span class="k">import</span> <span class="nn">new</span> <span class="k">from</span> <span class="nn">django.core.handlers.wsgi</span> <span class="k">import</span> <span class="n">WSGIRequest</span> <span class="k">from</span> <span class="nn">django.http</span> <span class="k">import</span> <span class="n">HttpResponseRedirect</span> <span class="k">from</span> <span class="nn">django.core.urlresolvers</span> <span class="k">import</span> <span class="n">reverse</span> <span class="k">from</span> <span class="nn">django.contrib.sessions.middleware</span> <span class="k">import</span> <span class="n">SessionWrapper</span> <span class="k">from</span> <span class="nn">django.template</span> <span class="k">import</span> <span class="n">RequestContext</span><span class="p">,</span> <span class="n">add_to_builtins</span> <span class="k">from</span> <span class="nn">django.shortcuts</span> <span class="k">import</span> <span class="n">render_to_response</span> <span class="c">##</span> <span class="c">## Request Handler Middleware</span> <span class="c">##</span> <span class="c"># Really I would like to add these, but don&#39;t currently have need or know-how</span> <span class="c"># - is_rss()</span> <span class="c"># - is_atom()</span> <span class="c"># - is_mobile()</span> <span class="c"># - is_wap()</span> <span class="c"># - is_mobile()</span> <span class="k">def</span> <span class="nf">_is_ajax</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">META</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;HTTP_X_REQUESTED_WITH&#39;</span><span class="p">)</span> <span class="o">==</span> <span class="s">&#39;XMLHttpRequest&#39;</span> <span class="k">def</span> <span class="nf">_is_get</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s">&#39;GET&#39;</span> <span class="k">def</span> <span class="nf">_is_post</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s">&#39;POST&#39;</span> <span class="k">def</span> <span class="nf">_is_put</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s">&#39;PUT&#39;</span> <span class="c"># Simple redirect that handles most normal use</span> <span class="k">def</span> <span class="nf">_redirect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwArgs</span><span class="p">):</span> <span class="k">return</span> <span class="n">HttpResponseRedirect</span><span class="p">(</span><span class="n">reverse</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwArgs</span><span class="p">))</span> <span class="c"># Ideally I woulnd&#39;t want this in here, but RequestContext forced me</span> <span class="k">def</span> <span class="nf">_render</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">template</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="p">()):</span> <span class="k">return</span> <span class="n">render_to_response</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">context_instance</span><span class="o">=</span><span class="n">RequestContext</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span> <span class="k">class</span> <span class="nc">RequestHandlerMiddleware</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="k">def</span> <span class="nf">process_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span> <span class="n">request</span><span class="o">.</span><span class="n">is_ajax</span> <span class="o">=</span> <span class="n">new</span><span class="o">.</span><span class="n">instancemethod</span><span class="p">(</span><span class="n">_is_ajax</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">WSGIRequest</span><span class="p">)</span> <span class="n">request</span><span class="o">.</span><span class="n">is_get</span> <span class="o">=</span> <span class="n">new</span><span class="o">.</span><span class="n">instancemethod</span><span class="p">(</span><span class="n">_is_get</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">WSGIRequest</span><span class="p">)</span> <span class="n">request</span><span class="o">.</span><span class="n">is_post</span> <span class="o">=</span> <span class="n">new</span><span class="o">.</span><span class="n">instancemethod</span><span class="p">(</span><span class="n">_is_post</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">WSGIRequest</span><span class="p">)</span> <span class="n">request</span><span class="o">.</span><span class="n">is_put</span> <span class="o">=</span> <span class="n">new</span><span class="o">.</span><span class="n">instancemethod</span><span class="p">(</span><span class="n">_is_put</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">WSGIRequest</span><span class="p">)</span> <span class="n">request</span><span class="o">.</span><span class="n">redirect</span> <span class="o">=</span> <span class="n">new</span><span class="o">.</span><span class="n">instancemethod</span><span class="p">(</span><span class="n">_redirect</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">WSGIRequest</span><span class="p">)</span> <span class="n">request</span><span class="o">.</span><span class="n">render</span> <span class="o">=</span> <span class="n">new</span><span class="o">.</span><span class="n">instancemethod</span><span class="p">(</span><span class="n">_render</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">WSGIRequest</span><span class="p">)</span> <span class="k">return</span> <span class="bp">None</span> </pre></div> <div style='display:none'> <br/>import new <br/>from django.core.handlers.wsgi import WSGIRequest <br/>from django.http import HttpResponseRedirect <br/>from django.core.urlresolvers import reverse <br/>from django.contrib.sessions.middleware import SessionWrapper <br/>from django.template import RequestContext, add_to_builtins <br/>from django.shortcuts import render_to_response <br/> <br/>## <br/>## Request Handler Middleware <br/>## <br/># Really I would like to add these, but don't currently have need or know-how <br/># - is_rss() <br/># - is_atom() <br/># - is_mobile() <br/># - is_wap() <br/># - is_mobile() <br/> <br/>def _is_ajax(self): <br/> return self.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest' <br/> <br/>def _is_get(self): <br/> return self.method == 'GET' <br/> <br/>def _is_post(self): <br/> return self.method == 'POST' <br/> <br/>def _is_put(self): <br/> return self.method == 'PUT' <br/> <br/># Simple redirect that handles most normal use <br/>def _redirect(self, url, *args, **kwArgs): <br/> return HttpResponseRedirect(reverse(url, *args, **kwArgs)) <br/> <br/># Ideally I woulnd't want this in here, but RequestContext forced me <br/>def _render(self, template, data=()): <br/> return render_to_response(template, data, <br/> context_instance=RequestContext(self)) <br/> <br/>class RequestHandlerMiddleware(object): <br/> <br/> def process_request(self, request): <br/> request.is_ajax = new.instancemethod(_is_ajax, request, WSGIRequest) <br/> request.is_get = new.instancemethod(_is_get, request, WSGIRequest) <br/> request.is_post = new.instancemethod(_is_post, request, WSGIRequest) <br/> request.is_put = new.instancemethod(_is_put, request, WSGIRequest) <br/> request.redirect = new.instancemethod(_redirect, request, WSGIRequest) <br/> request.render = new.instancemethod(_render, request, WSGIRequest) <br/> return None <br/></div>