Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django中测试POST端点时,如何包含csrf令牌?_Python_Django_Testing_Csrf - Fatal编程技术网

Python 在django中测试POST端点时,如何包含csrf令牌?

Python 在django中测试POST端点时,如何包含csrf令牌?,python,django,testing,csrf,Python,Django,Testing,Csrf,我正在学习如何创建api端点,并尝试编写一个测试,以查看post请求是否返回200状态码。我计划编写更多的测试,看看端点是否也返回了所有预期的结果。我一直得到一个403状态码,我想这是因为我需要在post数据中包含一个csrf令牌。在django中测试POST端点的好方法是什么 我的测试: from django.test import TestCase from app import settings import requests class ProjectEndpoint(TestCas

我正在学习如何创建api端点,并尝试编写一个测试,以查看post请求是否返回200状态码。我计划编写更多的测试,看看端点是否也返回了所有预期的结果。我一直得到一个403状态码,我想这是因为我需要在post数据中包含一个csrf令牌。在django中测试POST端点的好方法是什么

我的测试:

from django.test import TestCase
from app import settings
import requests

class ProjectEndpoint(TestCase):
   def post_endpoint(self):
      data = {'hello':'23'}
      post_project = requests.post(settings.BASE_URL+'/api/project', params=data)
      self.assertEqual(post_endpoint.status_code, 200)
此测试继续失败,403!=二百


我认为这是因为视图受到了csrf攻击的保护,但我真的不确定。欣赏别人的洞察力

实际上,django不会(默认情况下)通过测试执行csrf检查,如下所示:

CsrfViewMiddleware通常是测试视图的一大障碍 功能,因为需要CSRF令牌,必须随 每个职位的要求。出于这个原因,Django的HTTP客户端将用于测试 已修改为在请求上设置标志,以释放 中间件和csrf_保护装饰器,使它们不再 拒绝请求。在所有其他方面(如发送cookies等), 他们的行为是一样的

如果出于某种原因,您希望测试客户端执行CSRF检查, 您可以创建强制CSRF的测试客户端实例 检查:

从django.test导入客户端

csrf\u客户端=客户端(强制csrf\u检查=真)

但是,这确实要求您使用Django客户端vs请求;据我所知,Django不模拟/instrument/等请求。。。因此,当您运行单元测试时,实际上是在访问真正的服务器

还要注意,您应该将测试函数命名为以test开头的名称_

类似这样的情况(当通过django manage.py test.ProjectEndpoint运行时)

def test_post_endpoint(self):
   data = {'hello':'23'}
   c = Client() #above, from django.test import TestCase,Client
   #optional, but may be necessary for your configuration: c.login("username","password")
   response = c.post('/api/project',params=data)
   self.assertEqual(response.status_code, 200)