如何使用python-requests库传递CSRF令牌?

时间:2015-04-27 15:19:50

标签: python django csrf-protection

我有一个应用需要从外部重定向到另一个带有一些POST数据的网址。我有另一个应用程序的CSRF令牌值。如何使用Python中的请求库构建一个简单的POST请求?

csrf_token = "kjsbfckjsdnfcksdnkl"
post_data = {'email': email, 'answer': answer}
response = request.post(URL, data=post_data)

我在哪里添加CSRF令牌?

5 个答案:

答案 0 :(得分:4)

您可以使用 POST参数 HTTP标头发送CSRF令牌。

编辑: Django的CSRF保护也需要Referer HTTP标头。它需要与请求具有相同的来源。

使用POST参数:

post_data = {'email': email, 'answer': answer, 'csrftoken': crsf_token_value}
headers = {'Referer': URL}
response = request.post(URL, data=post_data, headers=headers)

使用HTTP标头:

post_data = {'email': email, 'answer': answer}
headers = {'X-CSRFToken': csrf_token_value, 'Referer': URL}
response = request.post(URL, data=post_data, headers=headers)

答案 1 :(得分:0)

如果您使用最近的Django并CsrfMiddleware将其添加到post_data词典:

post_data = {'email': email, 'answer': answer, 'csrfmiddlewaretoken': 'yourtoken'}

如果变量名称正确,请检查表单。

如果要在同一台服务器上重定向,只需调用die其他视图功能。

答案 2 :(得分:0)

查看官方文档which covers sending a POST request with a CSRF token

CSRF令牌存储在cookie中(据我所知)。既然如此,您可以将cookie值存储为某个变量,然后在请求中使用该值。

答案 3 :(得分:0)

答案 4 :(得分:0)

我建议您使用请求库的会话对象。

此外,如果您要向同一主机发出多个请求,则基础TCP连接将被重用,这可能会显着提高性能,并且Session对象具有主要Requests API的所有方法。