我有一个应用需要从外部重定向到另一个带有一些POST数据的网址。我有另一个应用程序的CSRF令牌值。如何使用Python中的请求库构建一个简单的POST请求?
csrf_token = "kjsbfckjsdnfcksdnkl"
post_data = {'email': email, 'answer': answer}
response = request.post(URL, data=post_data)
我在哪里添加CSRF令牌?
答案 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)
另一种解决方法是使用csrf_exempt
装饰器。
https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt
答案 4 :(得分:0)
我建议您使用请求库的会话对象。
此外,如果您要向同一主机发出多个请求,则基础TCP连接将被重用,这可能会显着提高性能,并且Session对象具有主要Requests API的所有方法。