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

 大狗nonodq_284 发布于 2022-12-31 18:14

我正在学习如何创建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!= 200时仍然失败

我认为这是因为视图可以防止csrf攻击,但我真的不确定.欣赏某人的任何洞察力.

1 个回答
  • 实际上,根据https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#testing,django不会强制(默认情况下)使用测试进行csrf检查:

    由于需要必须与每个POST请求一起发送的CSRF令牌,CsrfViewMiddleware通常会成为测试视图函数的一大障碍.出于这个原因,Django的测试HTTP客户端已被修改为在请求上设置一个标志,放松中间件和csrf_protect装饰器,以便它们不再拒绝请求.在其他方面(例如发送cookie等),它们的行为相同.

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

    来自django.test import客户端

    csrf_client =客户端(enforce_csrf_checks = True)

    但是,这确实需要您使用Django Client vs请求; 据我所知,Django没有模拟/乐器等.请求...所以当你运行单元测试时,你实际上是在击中真正的服务器.

    另请注意,您应该将测试函数命名为以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)
    

    2022-12-31 18:17 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有