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'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">'HTTP_X_REQUESTED_WITH'</span><span class="p">)</span> <span class="o">==</span> <span class="s">'XMLHttpRequest'</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">'GET'</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">'POST'</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">'PUT'</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'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>
0 Comments >>
Tags:
Django,
Python