Ajaxによるアクセスかどうか判別するdecorator、Djangoさんの話です。

 Django | Request and response objects | Django documentation

 このページは先日よりAjaxを用いて内容の表示を行ったりしております。最初にロードされるのはページの土台部分だけでして、それからあらためてサーバの方へリクエストしましてJSON形式のデータを取得して埋め込みます。この辺りの処理はJavaScriptのライブラリの一つであるjQueryを使っているので凄く簡単楽々実装であります。有り難やー
 そんなわけで、あるパターンのURLを叩きますとJSON形式で返ってくるような仕組みになっているわけですが、普通にブラウザなどでアクセスしても返ってきてしまうのがちょっとみっともないかなぁと。別に公開している情報なので中身がどうというわけではないのですが、単なる文字の羅列が表示されてしまうのはちょっと。

 幸いにも特定のルールを守る事によってAjaxである事を確認できます。しかもそれはほとんどのJavaScriptライブラリが対応しているものですから、それらのライブラリを使ってAjaxを行えば自動的に通知する事ができます。そしてさらに、それを確認する事をDjangoの方も対応していますよ、それも凄く簡単お手軽に!
 これはもう対応せざるを得ない、書かざるを得ないって事でやってみました。Ajaxであれば普通にレスポンスを返し、そうでなければ400を返すdocorator関数です。


from django.http import HttpResponseBadRequest

def check_ajax_access(func):
    def inner(*args, **kwargs):
        if args[0].is_ajax():
            return func(*args, **kwargs)
        return HttpResponseBadRequest()
    return inner

 後は普通にviewの関数を書いてそれをデコレートしてあげてください。

 ちなみに、判定はHTTP_X_REQUESTED_WITHという名前のヘッダーにXMLHttpRequestがあるかないかで行われます(最初にこのヘッダーを仕込んだのはprototype.jsらしいです、かしこいなぁ、もう)。思いのほかシンプルな仕組みなので、他環境、他言語な方は自分で実装するのもいいと思いますよ。