我尝试使用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令牌?
答案 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代码来检查。