mathpython

DjangoでAlamofireのPOSTを扱うときはcsrf_exemptでcsrf機能を外す

AlamofireでDjangoのサーバーにアクセスするとき、GETはすんなりうまくいくが、POSTはうまくいかない。

Alamofire側:

Alamofire.request(url, method: .post, parameters: parameters).responseJSON{...}

urlにはPOSTしたいページ、parametersにはサーバーに送りたい変数を指定する。しかしこのままではうまくいかない。次のエラーが表示される。

Alamofire.AFError.responseSerializationFailed...

エラーにはjsonSerializationFailed...とあるから、responseJSONが違うかもしれないとか、あれこれ考えてしまう。

試しに.postを.getにすると成功する。Alamofireにheadersを設定したり、encodingをencoding: JSONEncoding.defaultにしたりしても、問題とまったく関係ない。ましてresponseJSONを別のものに置き換えても意味がない。

原因はDjangoのcsrf

このエラーは「DjangoはPOSTでcsrfを必要としている」のに「parametersにcsrfmiddlewaretokenが入っていないこと」による。Djangoを使っている人は「あー!そういうだった!」と思うかもしれない。

解決するにはDjangoのAPI専用ページだけcsrfを外す必要がある。例えばDjangoのviewsで、api_loginという関数でログインAPIページを表示しているとする。このとき

@csrf_exempt
def api_login(request):

と関数の上に@csrf_exemptを書く。これは特定のページだけcsrf機能を外すということ。この「外す機能」は

from django.views.decorators.csrf import csrf_exempt

をインポートしないといけない。

広告

教育総合サイト

高校化学専門サイト

色辞典

数の辞典