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

Django点赞功能测试失败:CSRF token疑似阻碍问题排查

CSRF token 疑似成为阻碍

我正在为Django应用编写测试用例,其中一个视图支持用户点赞其他用户帖子,但测试一直失败,疑似问题在于CSRF token,但无法确定。该视图不使用POST数据,仅依赖URL参数,此前同类问题靠解决CSRF修复,但本次尝试方法均无效。

以下是我的测试代码:

from django.test import TestCase, Client
from django.utils import timezone
from django.contrib.auth import get_user_model
from django.contrib.auth.models import User
from django.middleware.csrf import get_token

from .views import update
from .models import Post, Like

def setUp(self):
        # creates a user and logs into the client
        self.user = User.objects.create_user(username='testuser', password='testpass')
        self.client = Client()
        self.client.force_login(self.user)

--- some code ommited ---

def test_like_view(self):
        # make a post
        p1 = Post.objects.create(title='title', body='body', published_date=timezone.now(), created_by=self.user)

        # get CSRF token
        response = self.client.get(f'/{p1.id}/update/')
        csrf_token = response.cookies['csrftoken'].value

        # send POST request with CSRF token
        response = self.client.post(f'/{p1.id}/like/', {'csrfmiddlewaretoken': csrf_token})

        # check that the response status code is 302, indicating a redirect
        self.assertEqual(response.status_code, 302)

        # check that a Like object was created
        self.assertTrue(Like.objects.filter(post=p1).exists())

以下是对应的视图代码:

from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.utils import timezone
from django.db.models import Count
from django.contrib.auth.decorators import login_required

from .models import Post, Like

--- some code ommited ---

@login_required
def like(request, pk):
    #users cannot like posts that they have allready liked in the past
    post = Post.objects.get(id=pk)
    
    l = Like(users = request.user, posts = post)
    all_likes = Like.objects.all()
    for like in all_likes:
        if l.users == like.users and l.posts == like.posts:
            return HttpResponseRedirect('..')
    l.save()
    return HttpResponseRedirect('..')

我已手动测试该视图,确认功能正常,通过Microsoft Edge开发者工具可见CSRF token正在传输。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:57:21