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

How do I pass a CSRF token using the python-requests library?

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

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

在哪里添加 CSRF 令牌?

如果您使用的是最近的 Django CsrfMiddleware,请将其添加到 post_data 字典中:

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

检查表格变量名是否正确。

如果你想在同一台服务器上重定向,只需调用其他视图函数即可。

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

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

您可以将 CSRF 令牌作为 POST 参数HTTP header 发送。

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

使用POST参数:

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

使用 HTTP headers:

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

另一种解决方法是使用 csrf_exempt 装饰器。 https://docs.djangoproject.com/en/3.2/ref/csrf/#django.views.decorators.csrf.csrf_exempt.

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

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