You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Cypress.io无UI程序化登录Django服务器

解决Django + Cypress登录的CSRF问题

嘿,我太懂这种被Django CSRF卡脖子的感觉了!之前用Cypress做Django登录测试时也踩过这个坑,官方示例说禁用CSRF完全不适用我们这种要严格遵循Django规则的场景对吧?

Django默认的登录视图确实只认表单里的csrfmiddlewaretoken字段,完全不看请求头,所以得换个思路来处理。这里有两种靠谱的方案,你可以根据测试场景选:

方案1:模拟真实用户提交表单(推荐)

这种方法最贴近真实用户操作,Cypress会自动帮你带上表单里的CSRF token,根本不用手动处理,简单粗暴又有效:

describe('Django登录测试', () => {
  it('使用有效凭据成功登录', () => {
    // 先访问登录页面
    cy.visit('/accounts/login/')
    
    // 填写用户名和密码
    cy.get('input[name="username"]').type('你的测试用户名')
    cy.get('input[name="password"]').type('你的测试密码')
    
    // 提交登录表单
    cy.get('form').submit()
    
    // 验证登录成功(根据你的站点实际情况调整)
    cy.url().should('include', '/dashboard/') // 假设登录后跳转到仪表盘
    cy.contains('欢迎回来,你的测试用户名') // 页面出现用户欢迎语
  })
})

方案2:用cy.request手动提交请求

如果你的测试需要在登录后直接发起API请求,不想走页面跳转流程,那可以手动提取CSRF token再发送POST请求:

describe('Django登录API测试', () => {
  it('通过API请求完成登录', () => {
    // 先访问登录页面,获取CSRF token和会话Cookie
    cy.visit('/accounts/login/')
    
    // 提取页面里的CSRF token并保存为别名
    cy.get('input[name="csrfmiddlewaretoken"]')
      .invoke('val')
      .as('csrfToken')
    
    // 使用提取到的CSRF token发送登录请求
    cy.get('@csrfToken').then((csrfToken) => {
      cy.request({
        method: 'POST',
        url: '/accounts/login/',
        form: true, // 关键!自动把请求体编码成表单格式
        body: {
          username: '你的测试用户名',
          password: '你的测试密码',
          csrfmiddlewaretoken: csrfToken
        }
      })
    })
    
    // 验证登录状态(比如访问需要登录的页面)
    cy.visit('/profile/')
    cy.get('#user-avatar').should('exist')
  })
})

几个关键注意点:

  • 确保你的测试账号是专门的测试环境账号,别用生产环境的!
  • 如果你的登录页面URL不是默认的/accounts/login/,记得改成你项目里的实际路径。
  • 方案2里的form: true一定要加,不然Django会识别不了请求体的格式,直接返回400错误。

内容的提问来源于stack exchange,提问作者JL Peyret

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:35:59