概要
Djangoで作ったサイトにPythonのrequestsモジュールを使ってログインしようとしたのですが、POSTのためのCSRFの認証がなかなかうまくいかなかったので要点を整理しておきます。
サンプルコード
要点は以下①~③の3つです。ややこしくなる理由は、ログインにcsrfが必要なこと(②)。及び、csrfがポストボタンを押すたびに変わってしまうため、csrfが古くならないようにPOSTする必要があること(①、③)です。
import requests
#ログインに必要な情報
#重要①:URLに「?next=アクセスしたいページ」の部分を含めてはいけない。
URL = "ログインページのURL"
ID = "ログインするユーザのID"
PASS = "ログインするユーザのパスワード"
NEXT = "アクセスしたいページ"
#重要②:まずログインページにアクセスしてクッキーからtokenを取得する
session = requests.session()
res = session.get(URL)
csrf = session.cookies['csrftoken']
login_info = {
"csrfmiddlewaretoken" : csrf,
"username" : ID,
"password" : PASS,
"next" : NEXT,
}
#重要③:headerにURLを渡す。
response = session.post(URL, data=login_info, headers=dict(Referer=URL))