『入る学科間違えた高専生』の日記

プログラミングのコードを書いたりする予定です。あとは日記等。あといつまで高専生やねん

【Django + Objective-C】CSRF に阻まれたので対処した

はじめに

今回はDjangoでWebアプリを作ってこの間なにやらTwitterStreamingAPIで作ったって記事を書いたと思うんですが,
その時に最後の方にスクリプトが知らないうちにダウンしてるって書いてそれの対処が
毎回,PCを開いてSSH接続してpython /path/to/script.py &ってやるのが激しくダルかったわけです.
それを回避するためにまずはWebアプリを作ってやればいいって思って思いつきでちゃちゃっと作って,
ついでならiOSアプリでも作るかって思って,タイトル通り見事にCSRFに引っかかって対処できたのでそれの紹介

nnsnodnb.hatenablog.jp

症状

f:id:nanashinodonbee:20160326000003p:plain

Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: forbidden (403)"

こんな感じに上はDjango側でPOSTでアクセスするとエラー吐きました.(普通アクセスとゴッチャゴチャですみません)
下はXcodeのエラーログです.Django側のエラー見る限り明らかにCSRFってわかったので,
とりあえず調べてその日は寝ました.

f:id:nanashinodonbee:20160326000327p:plain

ブラウザから普通にアクセスするとこんな感じにちゃんとアクセスできてます.

対処

stackoverflow.com

同じ症状があったので,これを参考にさせていただきました.
どうやら調べる限り日本産の記事がない?

POSTを受け取りたい関数に@csrf_exemptをつけろって書いてあったので,以下のようにした

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def myview():
    # 処理

views.pyはこんな感じ.

全部見せることになっちゃうんですが,ViewController.mはこんな感じの処理をさせてる.
外部からもスクリプトを実行できるようにローカルだけでなくモバイル回線でも実行できるように
CocoaPodsのReachabilityというライブラリを使用した.またHTTPアクセスには言わずと知れたAFNetworking

実際にUIBottunを押してDjangoデバッグログに出てきたログは以下のような感じ.
ちゃんとPOSTとして200を返しています.無事完了ですね.

f:id:nanashinodonbee:20160326002902p:plain

最後に

Djangoスペシャリストの先輩方はこのぐらい当たり前なんでしょうが,私はまだまだなのでいい勉強ができました.
Djangoの生ソースを見せることはちょっとアレなのでできませんが,これでStreamingがダウンしてても
iOS端末からの操作で起動することができるようになりました.

クッソダッサイiOSアプリ側のデザインを見せるとこんな感じです.

f:id:nanashinodonbee:20160326003741p:plain

非常にダサいですね.

おまけ

教祖がこんなことを仰っていたので勉強がてら教祖をタップすると教祖が増えるアプリを作ってみました.

動画

リポジトリ

github.com