Django使用python请求进行身份验证

Django使用python请求进行身份验证,django,post,python-requests,Django,Post,Python Requests,在整理如何针对django应用程序正确验证python请求客户端以允许POST时遇到问题。我们的代码尝试先登录,然后使用已建立的python请求会话来发布数据,但我们的POST请求始终未经验证 这是我们正在尝试的 # client.py LOGIN_URL = 'http://localhost/accounts/login' ADD_URL = 'http://localhost/add' import requests rqst = requests.session() rsp = rqs

在整理如何针对django应用程序正确验证
python请求
客户端以允许
POST
时遇到问题。我们的代码尝试先登录,然后使用已建立的
python请求
会话来发布数据,但我们的
POST
请求始终未经验证

这是我们正在尝试的

# client.py
LOGIN_URL = 'http://localhost/accounts/login'
ADD_URL = 'http://localhost/add'

import requests
rqst = requests.session()
rsp = rqst.get(LOGIN_URL)

token = rsp.cookies['csrftoken']
rsp = rqst.post(LOGIN_URL, auth=(uname, pwd),
        data={'csrfmiddlewaretoken':token, 'next':'/'})
# at this point, rsp.status_code == 200 and we are logged in

payload = {'foo':'bar', 'csrfmiddlewaretoken':token}
rsp = rqst.post(ADD_URL, json=payload)
# Error -- this post always returns 403 -> HttpResponseForbidden

我们已经在
settings.py
中启用了django会话。我们可以使用相同的模式访问
GET
视图。这是我们唯一遇到麻烦的
POST


有什么想法和建议吗?

我以前在django项目的requests.sessions中遇到过问题。我确信这是可行的,但我发现使用Selenium作为无头浏览器更容易。对selenium有很好的python支持,而且开始使用它非常简单


您的第二个POST请求没有CSRF令牌(即使登录请求有)


除非您的视图标记为
@csrf\u emption
,否则所有非GET请求都需要csrf令牌。

该问题是由于我对django身份验证的混淆造成的。Django身份验证是基于表单的,而默认情况下,
rqst.post(…,auth=(uname,pwd))
是基于表单的

因此,第一次调用
rqst.post()
时出错。更正后的client.py代码为:

# client.py
LOGIN_URL = 'http://localhost/accounts/login'
ADD_URL = 'http://localhost/add'

import requests
rqst = requests.session()
rsp = rqst.get(LOGIN_URL)

token = rsp.cookies['csrftoken']
rsp = rqst.post(LOGIN_URL, 
        data={'username':uname, 'password': pwd,  # <---- HERE IS FIX
        'csrfmiddlewaretoken':token, 'next':'/'})
#client.py
登录http://localhost/accounts/login'
添加http://localhost/add'
导入请求
rqst=requests.session()
rsp=rqst.get(登录地址)
令牌=rsp.cookies['csrftoken']
rsp=rqst.post(登录地址,

data={'username':uname,'password':pwd,#我想添加一个对我有帮助的用户590028示例,但出于某种原因,添加/after/your LOGIN\u URL是很重要的,如果服务器是这样设置的

在我的项目的URL中。py:

urlpatterns=[
路径('login/',auth_views.LoginView.as_view(template_name='users/login.html'),name='login'),
]

因此,这不起作用:我希望它能这么简单。不幸的是,即使在第二篇文章中添加了
csrfmiddlewaretoken
之后,我也得到了相同的结果。我甚至尝试添加
@csrf\u empture
装饰器,但结果仍然相同。
# client.py
LOGIN_URL = 'http://localhost/accounts/login'
ADD_URL = 'http://localhost/add'

import requests
rqst = requests.session()
rsp = rqst.get(LOGIN_URL)

token = rsp.cookies['csrftoken']
rsp = rqst.post(LOGIN_URL, 
        data={'username':uname, 'password': pwd,  # <---- HERE IS FIX
        'csrfmiddlewaretoken':token, 'next':'/'})