尝试连接到localhost时出现涉及CSRF的403错误(python请求)

时间:2018-02-20 01:11:43

标签: python django python-requests

我尝试使用Python的requests库测试与我的某个Django视图的连接。当我尝试在其上发出POST请求时,我会在查看request.text时收到信息,告诉我CSRF验证失败,并且在提交表单时我需要CSRF令牌。我已经在这里做了更多的研究,并尝试了这个

这是我现在的代码:

post_request = requests.session()
post_request.get('http://127.0.0.1:8000/message/')
csrftoken = post_request.cookies['csrftoken']

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'}
final_request = post_request.post('http://127.0.0.1:8000/message/', headers=dict(Referer=post_request))

这是我的观点:

def add_message(request):
    form = InputInfoForm(request.POST)

    if request.method == 'POST':
        return HttpResponse('hey')

    return HttpResponse('test')

那么如何使用请求验证视图中的CSRF令牌?

2 个答案:

答案 0 :(得分:1)

您应该在POST数据中发送CSRF令牌

r = post_request.post(
    'http://127.0.0.1:8000/message/', 
    data={'csrfmiddlewaretoken': csrftoken},
    headers=dict(Referer=URL)
)

发送CSRF令牌的其他方式是通过标头

r = post_request.post(
    'http://127.0.0.1:8000/message/', 
    headers={'Referer': URL, 'X-CSRFToken': csrftoken)
)

HTTP_X_CSRFTOKEN是默认值settings.CSRF_HEADER_NAME

答案 1 :(得分:1)

您的代码存在以下问题。 Django希望你的cookie中有CSRFTOKEN,但是必须为你的帖子参数提供一个名为csrfmiddlewaretoken的帖子数据。所以,使用python请求方法,

post_request = requests.session()
post_request.get('http://127.0.0.1:8000/message/')
csrftoken = post_request.cookies['csrftoken']
#now the csrftoken cookie is stored in csrftoken
final_request = post_request.post('http://127.0.0.1:8000/message/', data = {'csrfmiddlewaretoken' : csrftoken}, cookies=post_request.cookies) #assuming the post data for your form is empty, else add in the 'data' dictionary. just check your 'InputInfoForm' form for any fields. 
final_request.text  #will read you the data returned from the view, in your case "hey"

在您看来,进行以下更改

from django.shortcuts import render  #needed
def add_message(request):
    form = InputInfoForm(request.POST)

    if request.method == 'POST':
        return HttpResponse('hey')

    return render(request, 'test.html')  #assuming no context...

在您的app文件夹中,添加“templates”文件夹并在模板中创建“test.html”文件。然后添加以下

<form method="POST" action="{% url 'message:test'%}">{%csrf_token%}</form>

然后在项目文件夹的urls.py中添加

from django.conf.urls import url, include
urlpatterns = [
#admin_page --snip--
url(r'^message/', include('APPNAME.urls', namespace='message')),
]

然后在你的app文件夹中,创建一个'urls.py'文件并添加以下内容......

from .views import add_message #your view
from django.conf.urls import url

app_name = "APP_NAME"  #from django2.0 on wards 
urlpatterns = [
    url(r'^$', add_message, name='test'), 
] 
那么你很高兴。通过运行上面的python代码来检查。