Django项目接入DRF API:选Session认证还是Token认证?
先把两种认证的核心适用场景说清楚,再结合你已经用Django默认视图做了用户认证的情况给建议:
如果你只是给现有Django模板页面加API(前后端不分离)
直接沿用Session认证就完事儿,完全不用折腾。DRF本身就支持Session认证,和你现有用户系统完美兼容——用户登录Django的页面后,访问API时会自动带session cookie,认证逻辑不用改,你自定义的头像字段也能直接通过序列化器返回。
配置也简单,在DRF的settings里把SessionAuthentication加到DEFAULT_AUTHENTICATION_CLASSES里,要么全局配置,要么给单个API视图加@authentication_classes([SessionAuthentication])装饰器就行。
如果你要给独立前端(Vue/React)或第三方客户端提供API(前后端分离)
优先上Token认证(DRF自带的TokenAuthentication就行,要是需要过期、刷新功能,也可以用djangorestframework-simplejwt这类JWT库)。因为Session依赖cookie,跨域场景下处理起来麻烦,Token直接放在请求头里,适配各种客户端更方便。
要是不想放弃现有Session认证的功能,也可以同时开两种——DRF支持同时配置多个认证类,视图会挨个尝试认证,这样既不影响原来的Django视图,又能给API客户端提供Token入口。
具体配置示例
同时开启两种认证(兼顾旧系统和新API)
在settings.py里加这段:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.TokenAuthentication', ], }
之后可以给需要Token访问的视图单独指定认证类,或者用permission_classes控制哪些接口需要认证。
处理自定义头像字段的序列化
你自定义了注册视图和头像字段,写DRF序列化器的时候直接把头像加进去就行:
from rest_framework import serializers from django.contrib.auth.models import User # 要是你用了自定义用户模型就导你的模型 class CustomUserSerializer(serializers.ModelSerializer): avatar = serializers.ImageField() # 对应你用户模型里的头像字段 class Meta: model = User fields = ('id', 'username', 'email', 'avatar')
总结
- 没前后端分离需求:直接用Session认证,零成本兼容现有系统
- 有前后端分离/多客户端需求:开Token认证,同时保留Session认证不影响旧功能
- 要是以后API需求变多,JWT比DRF自带的Token更灵活,支持过期刷新,到时再升级也来得及
内容的提问来源于stack exchange,提问作者learner

