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

React+Django+DRF项目中request.user返回AnonymousUser求助

解决Django+React创建订单时request.user为AnonymousUser的问题

核心原因

请求未携带有效的认证信息,导致Django REST Framework(DRF)无法识别当前登录用户。

解决方案步骤

1. 配置DRF认证与权限

在Django项目的settings.py中添加或修改REST_FRAMEWORK配置,启用认证类并设置访问权限:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',  # 会话认证
        'rest_framework.authentication.TokenAuthentication',   # Token认证(二选一或同时启用)
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',  # 仅允许已认证用户访问接口
    ]
}

在视图上显式添加权限装饰器,确保未认证请求被拦截:

from rest_framework.permissions import IsAuthenticated
from rest_framework.decorators import permission_classes

@api_view(['GET', 'POST'])
@permission_classes([IsAuthenticated])  # 新增权限控制
def orderCreate(request):
    print(str(request.user) + '\n')  # 现在会返回真实登录用户
    
    if request.method == 'POST':
        ser = serializer.OrderSerializer(data=request.data)
        if ser.is_valid():
            ser.save(user=request.user)  # 将当前用户关联到订单
            return Response(ser.data, status=status.HTTP_201_CREATED)
        return Response(ser.errors, status=status.HTTP_400_BAD_REQUEST)
    
    orders = models.Order.objects.all()
    serialized = serializer.OrderSerializer(orders, many=True)
    return Response(serialized.data, status=status.HTTP_200_OK)

2. 前端请求携带认证信息

根据选择的认证方式,修改Axios请求逻辑:

方式一:会话认证(基于Cookie)

确保Axios请求携带Cookie,同时配置Django允许跨域凭证:

const orderApi = async (e) => {
    e.preventDefault();
    try {
        const {status} = await axios.post('http://127.0.0.1:8000/api-1/order/create/', all, {
            withCredentials: true  // 携带Cookie发送请求
        });
        if (status === 201) {
            console.log('created');
        }
    } catch (err) {
        console.log(err)
    }
}

在Django的settings.py中配置CORS:

CORS_ALLOWED_ORIGINS = [
    "http://localhost:3000",  // 你的React前端地址
]
CORS_ALLOW_CREDENTIALS = True  // 允许跨域携带凭证

方式二:Token认证

登录成功后将Token存储到localStorage,请求时在Header中携带:

const orderApi = async (e) => {
    e.preventDefault();
    try {
        const token = localStorage.getItem('auth_token');  // 从本地存储获取Token
        const {status} = await axios.post('http://127.0.0.1:8000/api-1/order/create/', all, {
            headers: {
                'Authorization': `Token ${token}`  // 添加Token认证头
            }
        });
        if (status === 201) {
            console.log('created');
        }
    } catch (err) {
        console.log(err)
    }
}

3. 修复前端State设置错误

你的React代码中useEffect的setAll写法有误,修正为:

useEffect(() => {
    setAll({'game': state[0], 'price': suggestion});  // 合并为一个完整对象
}, [])

4. 确保订单模型包含用户字段

在Order模型中添加关联用户的外键字段:

from django.contrib.auth.models import User

class Order(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)  // 关联当前登录用户
    game = models.ForeignKey(Game, on_delete=models.CASCADE)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    // 其他业务字段...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 02:35:23