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