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

Django登录后发起REST请求:无需传递用户ID识别用户的方法

Django REST 无需传递用户ID识别用户的可行方案

在Django REST框架中,完全可以通过身份认证机制自动识别当前请求的用户,无需手动传递客户ID。以下是几种成熟的实现方案,适配不同的项目场景:

1. Session 认证(适合前后端同构/带Cookie的场景)

这是Django默认的认证方式,依赖浏览器Cookie维护会话。用户登录后,Django会在客户端设置Session Cookie,后续所有请求都会自动携带该Cookie,后端通过request.user直接获取当前用户。

配置与使用:

  • 在项目settings.py中配置REST框架的认证类:
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',  # 默认要求登录
    ]
}
  • 视图中直接通过request.user获取用户,比如购物车详情接口:
from rest_framework.views import APIView
from rest_framework.response import Response

class CartDetailView(APIView):
    def get(self, request):
        # 自动获取当前登录用户,无需传ID
        cart = request.user.cart_set.first()
        # 组装购物车数据返回
        cart_items = [{"name": item.product.name, "quantity": item.quantity} for item in cart.items.all()]
        return Response({"cart": cart_items})
  • 登录/登出可直接复用Django自带的LoginView和LogoutView,或自行实现,登录后Session会自动维护。

2. Token 认证(适合前后端分离/无Cookie的场景)

通过给每个用户生成唯一Token,前端登录后保存Token,后续请求在HTTP Header中携带Authorization: Token <你的token值>,后端验证Token后自动关联到对应用户。

配置与使用:

  • 先在settings.py中启用Token认证:
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ]
}
  • 生成Token的登录视图(可自定义):
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.response import Response
from rest_framework.authtoken.models import Token

class CustomLoginView(ObtainAuthToken):
    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, _ = Token.objects.get_or_create(user=user)
        return Response({"token": token.key, "username": user.username})
  • 用户地址接口示例:
class UserAddressView(APIView):
    def get(self, request):
        # 直接通过request.user获取当前用户
        addresses = request.user.address_set.all()
        address_list = [{"id": addr.id, "detail": addr.full_detail, "phone": addr.phone} for addr in addresses]
        return Response({"addresses": address_list})

3. JWT 认证(适合分布式/高并发场景)

JWT(JSON Web Token)是一种自包含的令牌,Token本身携带用户信息,后端通过验证签名即可识别用户,无需在数据库存储Token,适合分布式系统。可以用djangorestframework-simplejwt库快速实现。

配置与使用:

  • 安装依赖:pip install djangorestframework-simplejwt
  • 在settings.py中配置:
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ]
}

# 可选配置JWT过期时间等
SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
}
  • 项目urls.py中添加JWT的Token获取端点:
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)

urlpatterns = [
    # 其他路由...
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
  • 我的上架产品接口示例:
class MyProductsView(APIView):
    def get(self, request):
        # 自动识别当前用户,过滤其上架的产品
        products = Product.objects.filter(seller=request.user)
        product_list = [{"name": p.name, "price": p.price, "status": p.status} for p in products]
        return Response({"my_products": product_list})

通用注意事项

  • 所有用户特定接口(如我的购物车、我的地址)必须添加IsAuthenticated权限类,确保只有登录用户能访问。
  • 登出操作:Session认证直接调用Django的logout视图;Token认证可删除用户对应的Token;JWT认证只需前端丢弃Token,若需强制失效可实现Token黑名单机制。
  • 公开接口(如公共产品查询)可移除IsAuthenticated权限类,无需用户登录即可访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:42:47