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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:13:49