$.ajaxのscccessとerrorと、DjangoのHttpResponse

$.ajaxしたらsccessとerrorの処理を書かなくてはいけない

コールバックですね

$.ajax
    type: "GET"
    data:
        q: $(@).val()
        in_reply_to_status_id: localStorage.in_reply_to_status_id
    url: "http://192.168.56.101:8000/update_status"
    #url: "http://127.0.0.1:8000/update_status"
    dataTpye: "json"
    success: =>
        alert "発言しました"
        #テキストエリアを消す
        $(@).val('')
        $(@).blur()
        $('#count').text(max_length)
    error: (XMLHttpRequest, textStatus, errorThrown)->
        alert "なんか発言失敗したっぽい"

こんな感じ。そのときのDjangoのAPIの実装としては、HttpResponseを返す必要がある。

class HttpResponse(object):
    """A basic HTTP response, with content and dictionary-accessed headers."""

    status_code = 200

    def __init__(self, content='', mimetype=None, status=None,
            content_type=None):
        # _headers is a mapping of the lower-case name to the original case of
        # the header (required for working with legacy systems) and the header
        # value.  Both the name of the header and its value are ASCII strings.
        self._headers = {}
        self._charset = settings.DEFAULT_CHARSET
        if mimetype:
            content_type = mimetype     # For backwards compatibility
        if not content_type:
            content_type = "%s; charset=%s" % (settings.DEFAULT_CONTENT_TYPE,
                    self._charset)
        if not isinstance(content, basestring) and hasattr(content, '__iter__'):
            self._container = content
            self._is_string = False
        else:
            self._container = [content]
            self._is_string = True
        self.cookies = SimpleCookie()
        if status:
            self.status_code = status

        self['Content-Type'] = content_type
.......

django.http.__init__.py を見るとまあかれこれ続く。デフォルトではsatus_code=200なので、そのまま使ってやると200が返るので、 $.ajaxの挙動としてはsuccessだ。
では失敗する場合は?

class HttpResponsePermanentRedirect(HttpResponse):
    status_code = 301

    def __init__(self, redirect_to):
        super(HttpResponsePermanentRedirect, self).__init__()
        self['Location'] = iri_to_uri(redirect_to)

class HttpResponseNotModified(HttpResponse):
    status_code = 304

class HttpResponseBadRequest(HttpResponse):
    status_code = 400

class HttpResponseNotFound(HttpResponse):
    status_code = 404

class HttpResponseForbidden(HttpResponse):
    status_code = 403

class HttpResponseNotAllowed(HttpResponse):
    status_code = 405

    def __init__(self, permitted_methods):
        super(HttpResponseNotAllowed, self).__init__()
        self['Allow'] = ', '.join(permitted_methods)

class HttpResponseGone(HttpResponse):
    status_code = 410

class HttpResponseServerError(HttpResponse):
    status_code = 500

こんな感じでHttpResponseクラスを継承した形でいろいろと定義されている。APIのリクエストで失敗するときに使うのはHttpResponseServerErrorですね。
なので、実際のコードはこんな感じにしてみた。

from django.http import HttpResponse, HttpResponseServerError, HttpResponseRedirect
......

def update_status(request):
    auth = setOAuth(request)
    api = tweepy.API(auth_handler=auth)
    try:
        api.update_status(status=request.GET.get('q'), in_reply_to_status_id=request.GET.get('in_reply_to_status_id'))
    except Exception, e:
        print "発言失敗したっぽい"
        return HttpResponseServerError()
    return HttpResponse()

こんな感じでつかってやる。