ТипError при использовании учебника по обучению django rest framework
Я новичок в использовании Django Rest framework, я следую этому руководству Django-Rest-Framework
Вместо фрагментов моя модель состоит из пользовательского файла, как показано ниже:
class UserProfile(models.Model):
user = models.OneToOneField(User)
emp_code = models.CharField(max_length=10, blank=True)
user_type = models.IntegerField(max_length=1, default=0, choices=USER_TYPE)
group = models.ForeignKey(Group, null=True, blank=True)
status = models.SmallIntegerField(max_length=1,default=0)
added_on = models.DateTimeField(auto_now_add=True)
Первая часть учебника прошла отлично, получила желаемый результат в формате json, как упоминалось, однако во втором уроке я получаю ошибку типа:
TypeError at /authentication/userprofile/
'type' object is not iterable
Request Method: GET
Request URL: http://*****.com/authentication/userprofile/
Django Version: 1.6
Exception Type: TypeError
Exception Value:
'type' object is not iterable
Exception Location: /home/web/cptm_venv/lib/python2.7/site- packages/rest_framework/views.py in get_permissions, line 226
Python Executable: /usr/bin/python
Python Version: 2.7.3
Python Path:
['/home/web/cptm_venv/lib/python2.7/site-packages',
'/home/web/cptm',
'/home/web/cptm_venv/lib/python2.7/site-packages',
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-linux2',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages',
'/usr/lib/pymodules/python2.7']
Server time: Wed, 11 Dec 2013 17:33:54 +0530
Traceback Switch to copy-and-paste view
/home/web/cptm_venv/lib/python2.7/site-packages/django/core/handlers/base.py in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs) ...
▶ Local vars
/home/web/cptm_venv/lib/python2.7/site-packages/django/views/generic/base.py in view
return self.dispatch(request, *args, **kwargs) ...
▶ Local vars
/home/web/cptm_venv/lib/python2.7/site-packages/django/views/decorators/csrf.py in wrapped_view
return view_func(*args, **kwargs) ...
▶ Local vars
/home/web/cptm_venv/lib/python2.7/site-packages/rest_framework/views.py in dispatch
response = self.handle_exception(exc) ...
▶ Local vars
/home/web/cptm_venv/lib/python2.7/site-packages/rest_framework/views.py in dispatch
self.initial(request, *args, **kwargs) ...
▶ Local vars
/home/web/cptm_venv/lib/python2.7/site-packages/rest_framework/views.py in initial
self.check_permissions(request) ...
▶ Local vars
/home/web/cptm_venv/lib/python2.7/site-packages/rest_framework/views.py in check_permissions
for permission in self.get_permissions(): ...
▶ Local vars
/home/web/cptm_venv/lib/python2.7/site-packages/rest_framework/views.py in get_permissions
return [permission() for permission in self.permission_classes] ...
▶ Local vars
Остальная часть кода почти такая же, как в приведенной выше ссылке во второй части и третьей части:
views.py
from apps.authentication.models import UserProfile
from apps.authentication.serializers import UserProfileSerializer
from rest_framework import mixins
from rest_framework import generics
class UserProfileList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = UserProfile.objects.all()
serializer_class = UserProfileSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class UserProfileDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = UserProfile.objects.all()
serializer_class = UserProfileSerializer
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
urls.py
from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns
from apps.authentication import views
urlpatterns = patterns('',
url(r'^userprofile/$', views.UserProfileList.as_view()),
url(r'^userprofile/(?P<pk>[0-9]+)/$', views.UserProfileDetail.as_view()),
)
urlpatterns = format_suffix_patterns(urlpatterns)
Я пропустил что-то очень очевидное, много искал поиск того, что именно означает "объект типа, который не является итерируемым" в этом контексте, и какой объект вызывает проблему, но не повезло. Я использую Django Rest Framework версии 2.3.
Заранее спасибо
Ответы
Ответ 1
Как отметил Даниил выше, у меня был этот глупый фрагмент в файле настроек, который вызывал проблему,
#REST_FRAMEWORK = {
# '''Use hyperlinked styles by default'''
# '''only used if serializer_class attribute is not set on a view'''
# 'DEFAULT_MODEL_SERIALIZER_CLASS':
# 'rest_framkework.serializers.HyperLinkedModelSerializer',
# 'DEFAULT_PERMISSION_CLASSES':
# 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
# }
Признать это, и это сработало.
Ответ 2
Просто, чтобы сообщить другим, я продолжал получать ту же ошибку и обнаружил, что забыл включить запятую в мой REST_FRAMEWORK
. У меня было это:
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated'
),
вместо этого:
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
Запятая определяет это как одноэлементный кортеж
Ответ 3
У меня была такая же ошибка, когда я использовал пользовательские разрешения из-за "typo"
У меня было:
@permission_classes(EventByFacilityPermissions)
class EventByFacilityViewSet(viewsets.ModelViewSet):
вместо:
@permission_classes((EventByFacilityPermissions,))
class EventByFacilityViewSet(viewsets.ModelViewSet):
Ответ 4
В моем случае опечатка находилась в views.py
. Вместо...
permission_classes = (permissions.IsAuthenticated,)
... У меня было...
permission_classes = (permissions.IsAuthenticated)
Ответ 5
Передайте класс проверки подлинности внутри своего класса, а не в settings.py, если вам нужна аутентификация только в некоторых классах, и выполните следующие действия:
authentication_classes = [TokenAuthentication, ]
вместо этого:
authentication_classes = TokenAuthentication