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

使用Python requests登录Django时出现CSRF校验错误求助

问题根因分析
  • 首先是请求头Content-Type配置错误:标准URL编码表单的Content-Type值为application/x-www-form-urlencoded,你的代码中仅填写了x-www-form-urlencoded,缺失前缀导致Django无法正确解析请求体,自然无法提取到csrfmiddlewaretoken字段完成校验。
  • 其次是缺失Referer请求头:从你给出的响应头可以看到站点配置了Referrer-Policy: same-origin,Django的CSRF校验在同源策略下会验证Referer头的合法性,未携带该头也会触发校验失败。
  • 额外优化点:使用requests的data参数提交表单时,不需要手动指定Content-Type,requests会自动生成符合规范的请求头,避免手动配置出错。
修正后代码示例
from bs4 import BeautifulSoup
import requests

def login(url, username, password):
    session = requests.Session()
    # 模拟浏览器UA,避免部分站点拦截爬虫请求
    session.headers.update({
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"
    })
    # 访问登录页获取CSRF令牌
    login_page_url = f"{url}/accounts/login/"
    response = session.get(login_page_url)
    
    # 提取表单中的CSRF令牌
    soup = BeautifulSoup(response.text, "html.parser")
    form = soup.find("form", {"id":"login-form"})
    form_csrftoken = form.find("input", {"name":"csrfmiddlewaretoken"})['value']
    
    # 构造请求数据,添加Referer头
    data = {
        'csrfmiddlewaretoken': form_csrftoken,
        'username': username,
        'password': password,
        'next': '/'
    }
    response2 = session.post(
        login_page_url,
        data=data,
        headers={"Referer": login_page_url}
    )
    # 校验登录结果
    print(response2.status_code)
    print(response2.text)

内容的提问来源于stack exchange,提问作者Robert Rapplean

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:45:04