Skip to main content
 首页 » 编程设计

python之Django:使用 CSRF token 在服务器端发出 POST 请求

2025年05月04日27Renyi-Fan

我的网站使用 Django 的默认 auth 模块来进行用户身份验证。通常,用户只需要在登录页面填写一个 html 表单,使用他/她的用户名和密码,然后点击提交,然后 CSRF 保护的数据将被发布到 /auth/login/, Django 身份验证端点。

但现在出于某种原因我还需要在我的服务器上执行此操作。这是与后端身份验证服务器相同的服务器。经过研究和反复试验,我终于得到:

from django.views.generic import View 
from django.utils.decorators import method_decorator 
from django.views.decorators.csrf import csrf_protect 
import requests 
 
class fb_login(View): 
    "login view for Facebook OAuth" 
 
    @method_decorator(csrf_protect) 
    def get(self, request): 
        ''' code that gets username and password info. from user's FB profile 
        is not shown here ''' 
 
        # login code 
        url = 'http://localhost:8000/auth/login/' 
        client = requests.session() 
        # Retrieve the CSRF token first 
        client.get(url)  # sets cookie 
        csrftoken = client.cookies['csrftoken'] 
        form = {'username': uname, 'password': pw} 
        header = {'X-CSRFToken': csrftoken} 
        resp = requests.post(url, data=form, headers=header) 

我还尝试添加 csrf token 作为表单字段的一部分:

form = {'username': uname, 'password': pw , 'csrfmiddlewaretoken': csrftoken} 
resp = requests.post(url, data=form) 

我几乎只是关注了 Django doc .但我仍然收到 403 错误,提示 CSRF 验证失败,CSRF cookie 未设置。我想知道我是否在这里遗漏了什么?我已经根据 Django 文档仔细检查了该过程,但找不到任何可能有误或遗漏的内容。

请您参考如下方法:

正如@rodrigo 所建议的,cookie 也需要通过 CSRF 安全检查。这是一个简单的代码片段:

csrftoken = requests.get(url).cookies['csrftoken'] 
form = {'username': uname, 'password': pw} 
header = {'X-CSRFToken': csrftoken} 
cookies = {'csrftoken': csrftoken} 
resp = requests.post(url, data=form, headers=header, cookies=cookies)