我使用此脚本访问我的Django服务器并检索CSRF令牌,然后该令牌简单地尝试将数据发布到视图:
#!/usr/bin/env python2.7
import sys, time
import requests
username = 'root'
password = 'pass'
fileName, userFolder, uploadFolder = sys.argv
URL = 'http://127.0.0.1:8000/admin/login/'
client = requests.session()
# Retrieve the CSRF token first
client.get(URL) # sets cookie
if 'csrftoken' in client.cookies:
csrftoken = client.cookies['csrftoken']
login_data = dict(username=username, password=password, csrfmiddlewaretoken=csrftoken, next='')
r = client.post(URL, data=login_data, headers=dict(Referer=URL))
但是在我的Django开发服务器的访问日志中,我看到:
[03/Dec/2018 17:44:17] "GET /admin/login/ HTTP/1.1" 200 1637
[03/Dec/2018 17:44:17] "POST /admin/login/ HTTP/1.1" 302 0
Not Found: /accounts/profile/
[03/Dec/2018 17:44:17] "GET /accounts/profile/ HTTP/1.1" 404 9904
我不明白的是为什么我不断获得额外的Get和404?
是否可以将我的Python请求配置为忽略任何类型的重定向信号,而不管它是用于GET还是POST或session.get()
?
我尝试将allow_redirects=False
添加到client.get(URL, allow_redirects=False)
,但这没有帮助。
我的POST工作正常,我只是想消除额外的GET请求,这是不必要的混乱/开销。
谢谢。
答案 0 :(得分:1)
默认情况下,成功登录后Django重定向到/accounts/profile/
。
要阻止请求跟随重定向,您应该在allow_redirects=False
调用中使用session.post()
。