$.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()
こんな感じでつかってやる。