Django项目request.META添加用户认证及Graphs.js图表开发问询
解决方案:给Django REST Framework的ChartData视图添加用户认证
嘿,我来帮你搞定这个认证的问题!你现在的ChartData视图因为关闭了所有认证(authentication_classes = []),导致request.user没法正确关联到当前用户,而且request.META里也没有认证相关的信息。我们一步步来修复:
1. 启用视图的认证与权限类
首先,把你的ChartData视图改成启用DRF的认证机制,同时设置权限要求用户必须登录才能访问:
from rest_framework.views import APIView from rest_framework.authentication import TokenAuthentication, SessionAuthentication from rest_framework.permissions import IsAuthenticated from django.contrib.auth.models import User from .models import GrossAndNet from rest_framework.response import Response class ChartData(APIView): # 支持两种认证方式:Session(适合前后端同构)和Token(适合前后端分离) authentication_classes = [TokenAuthentication, SessionAuthentication] # 要求用户必须认证才能访问该接口 permission_classes = [IsAuthenticated] def get(self, request, format=None): # 这里request.user已经是当前认证的User实例,不需要再手动查询! gross_and_nets = GrossAndNet.objects.filter(user=request.user) years = [] gross_values = [] net_values = [] for gn in gross_and_nets: # 你的循环逻辑,比如: years.append(gn.year) gross_values.append(gn.gross) net_values.append(gn.net) return Response({ 'years': years, 'gross_values': gross_values, 'net_values': net_values })
2. 配置项目级的认证设置(可选但推荐)
如果你希望整个项目的API都默认启用认证,可以在settings.py里添加DRF的全局配置:
REST_FRAMEWORK = { # 默认认证类 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.TokenAuthentication', ], # 默认权限:所有API都需要登录才能访问 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ] }
如果用Token认证,还需要在INSTALLED_APPS里添加rest_framework.authtoken,然后运行迁移生成token表:
python manage.py migrate
3. 前端调用API时携带认证信息
根据你选择的认证方式,前端需要对应携带认证凭证,这样request.META里才会出现认证相关的字段:
情况1:Session认证(前后端同构,比如用Django模板)
如果你的前端是Django模板渲染的,用户登录后浏览器会自动携带session cookie,请求API时不需要额外处理,DRF会自动识别request.user。
情况2:Token认证(前后端分离)
你需要在前端请求的Authorization头里带上用户的token,比如用fetch调用API:
// 假设你已经从后端获取到了用户的token const userToken = '你的用户token'; fetch('/api/chart-data/', { method: 'GET', headers: { 'Authorization': `Token ${userToken}`, 'Content-Type': 'application/json' } }) .then(response => response.json()) .then(data => { // 用Graphs.js渲染图表,比如: new Graphs.LineChart({ element: '#chart', data: { labels: data.years, datasets: [ { label: 'Gross', data: data.gross_values }, { label: 'Net', data: data.net_values } ] } }); });
4. 验证request.META中的认证信息
启用认证后,DRF会把认证相关的内容放到request.META里,你可以在视图里打印查看:
def get(self, request, format=None): # 打印Authorization头(Token认证时会有) print(request.META.get('HTTP_AUTHORIZATION')) # 打印session相关信息(Session认证时会有) print(request.META.get('HTTP_COOKIE')) # 你的业务逻辑...
注意事项
- 你之前代码里的
user = User.objects.get(user=request.user)是多余的,因为request.user已经是认证后的User实例,直接用它过滤GrossAndNet即可。 - 如果存在跨域问题(前端和后端域名不同),需要配置CORS:安装
django-cors-headers,并在settings.py里设置CORS_ALLOW_CREDENTIALS = True。
内容的提问来源于stack exchange,提问作者lemac
相关产品推荐
相关产品推荐

