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
相关产品推荐
相关产品推荐

