我使用Django Rest Framework创建了一个简单的API,列出了学生和他们所在的大学。访问数据的URL是http://127.0.0.1:8000/api/v1/students/
。在测试API时,我遇到了以下错误:
TypeError at /api/v1/students/
'type' object is not iterable
Internal Server Error: /api/v1/students/
Traceback (most recent call last):
File "/Users/gilangramadhanilhami/Desktop/88sparses/shipment/tracking/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner
response = get_response(request)
File "/Users/gilangramadhanilhami/Desktop/88sparses/shipment/tracking/lib/python3.6/site-packages/django/core/handlers/base.py", line 128, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/Users/gilangramadhanilhami/Desktop/88sparses/shipment/tracking/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/gilangramadhanilhami/Desktop/88sparses/shipment/tracking/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/Users/gilangramadhanilhami/Desktop/88sparses/shipment/tracking/lib/python3.6/site-packages/django/views/generic/base.py", line 69, in view
return self.dispatch(request, *args, **kwargs)
File "/Users/gilangramadhanilhami/Desktop/88sparses/shipment/tracking/lib/python3.6/site-packages/rest_framework/views.py", line 477, in dispatch
request = self.initialize_request(request, *args, **kwargs)
File "/Users/gilangramadhanilhami/Desktop/88sparses/shipment/tracking/lib/python3.6/site-packages/rest_framework/views.py", line 379, in initialize_request
authenticators=self.get_authenticators(),
File "/Users/gilangramadhanilhami/Desktop/88sparses/shipment/tracking/lib/python3.6/site-packages/rest_framework/views.py", line 273, in get_authenticators
return [auth() for auth in self.authentication_classes]
TypeError: 'type' object is not iterable
我能在StackOverflow上找到一些解决方案,但并没有太多运气找到一个解决方案。我在
views.py
文件中使用APIView
,想要了解为什么使用APIView
(使用Viewset
时也会出现这个问题)时会发生这种情况。我尝试更改权限,但没有帮助。同时将
many=True
设置为“False”也无法解决这个问题。有人有任何想法吗?提前致谢。
以下是其他文件,以更好地理解此问题。 models.py
from django.db import models
class University(models.Model):
name = models.CharField(max_length=50)
url = models.URLField(unique=True)
class Meta:
verbose_name = "University"
verbose_name_plural = "Universities"
def __str__(self):
return self.name
class Student(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
university = models.ForeignKey(University, on_delete=models.CASCADE,)
class Meta:
verbose_name = "Student"
verbose_name_plural = "Students"
def __str__(self):
return '%s %s' % (self.first_name, self.last_name)
serializers.py
from rest_framework import serializers
from . import models
class StudentSerializer(serializers.ModelSerializer):
class Meta:
fields = (
'id',
'first_name',
'last_name',
'university'
)
model = models.Student
class UniversitySerializer(serializers.ModelSerializer):
class Meta:
fields = (
'id',
'name',
'url'
)
model = models.University
views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from . import models
from . import serializers
class ListStudent(APIView):
def list(self, request, format=None):
students = models.Student.objects.all()
serializer = serializers.StudentSerializer(students, many=True)
return Response(serializer.data)
students/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.ListStudent.as_view(), name='student_list')
]
urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
path('api/v1/students/', include(('students.urls','students'), namespace='students')),
]
DEFAULT_AUTHENTICATION_CLASSES
看起来像这样 `'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.SessionAuthentication'),`。由于值应该是一个元组,所以我漏掉了一个逗号。无论如何,还是谢谢你 :)
- Imperator123