Django の POST 処理を呼び出したとき、URL の後ろにスラッシュつけ忘れたらリダイレクトされて 405 Client Error: METHOD NOT ALLOWED が返ってきた


発生した問題

Django の POST 処理を呼び出したとき、URL の後ろにスラッシュつけ忘れたらリダイレクトされて 405 Client Error: METHOD NOT ALLOWED が返ってきた。

エラー内容

405 Client Error: METHOD NOT ALLOWED for url:
http://localhost:8000/confirm/api/
login/

呼びもとプログラム

  • Django Rest Frameworkで開発したAPIを呼び出す。
# 呼出しAPI ドメイン
API_DOMAIN = "http://localhost:8000"

# アプリケーションパス
APP_PATH = "/confirm/api"

# ログイン用URL(URL終端のスラッシュが抜けている)
LOGIN_URL = API_DOMAIN+APP_PATH+"/login"

def login():
    """ログイン
    """
    s = requests.session()

    # 外から渡せるようにしたい
    payload = LOGIN_INFO
    headers = {"pragma": "no-cache", 'content-type': 'application/json'}
    r =  s.post(LOGIN_URL, data=json.dumps(payload), headers=headers)
    r.raise_for_status()
    return s

何故エラーになるか

Django の APPEND_SLASH という settings.py の設定が原因(デフォルト True)

リクエストのURLの後ろにスラッシュがない場合、設定された URLConfにリクエストURLがマッチしなかったら、スラッシュ付きのURLでリダイレクトする。

その際、最初にPOSTした時のデータが失われてしまう。そのためエラーが発生していた。