属性错误 - 模型对象没有属性 'COOKIES'

Attribute Error - Model object has no attribute 'COOKIES'

我最初在从我的 API 获取数据时遇到问题,它给出了“禁止”错误,现在我已经用 cookie 和 csrf 令牌修复了它,它不再工作了。

错误:

cookie_token = request.COOKIES[settings.CSRF_COOKIE_NAME]
AttributeError: 'networthChart' object has no attribute 'COOKIES'
[30/Jan/2021] "GET /api/networthchart/data/ HTTP/1.1" 500 102936

我正在尝试从端点获取数据,但出现此错误。 这是代码:

JS:

<script>
    function getCookie(name) {
        let cookieValue = null;
        if (document.cookie && document.cookie !== '') {
            const cookies = document.cookie.split(';');
            for (let i = 0; i < cookies.length; i++) {
                const cookie = cookies[i].trim();
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) === (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
    const csrftoken = getCookie('csrftoken');
    
    
    const request = new Request(
        "/api/networthchart/data/",
        {headers: {'X-CSRFToken': csrftoken}}
    );
    
    
    
    $(document).ready(function(){
      var endpoint = 'http://127.0.0.1:8000/api/networthchart/data/'
      var defaultData = []
      var labels = []
      
      $.ajax({
        method:"GET",
        url: endpoint,
        success: function(data){
          labels = data.labels
          defaultData = data.default
          var ctx = document.getElementById('myChart').getContext('2d');
          var myChart = new Chart(ctx, {
              type: 'bar',
              data: {
                  labels: labels,
                  datasets: [{
                      label: '# of Votes',
                      data: defaultData,
                             .......
</script>

观点:

class networthChart(APIView, View):  
    authentication_classes = []
    permission_classes = []
    
    @ensure_csrf_cookie
    def get(self, request, format=None):
        print("its working")
        labels = ["Red","Green"]
        default_items = [8,10]

        if not self.request.user.is_active:
           return HttpResponseForbidden("Not signed in") # any error you want to display       
        
        data = {
            "labels" : labels,
            "default" : default_items,
        }
        return Response(data)

您正在装饰一个方法(一个属于 class 的函数)。装饰器通常用于装饰基于函数的视图,装饰你需要使用的方法method_decorator。问题是方法的第一个参数总是 class 的实例,而装饰器假设它是请求实例。试试这个:

from django.utils.decorators import method_decorator

@method_decorator(ensure_csrf_cookie)
def get(self, request, format=None):