Django使用python请求进行身份验证
在整理如何针对django应用程序正确验证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
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':'/'})