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

