web-dev-qa-db-ja.com

Django残りのフレームワークチュートリアルの使用中のTypeError

Django Restフレームワークを使用するのは初めてです。このチュートリアルに従っています 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形式で目的の出力が得られましたが、2番目のチュートリアル以降はタイプエラーになります。

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

残りのコードは、上のリンクの第2部と第3部で示されているものとほぼ同じです。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を使用しています。

前もって感謝します

29
Sirius

上記のダニエルが指摘したように、設定ファイルにこの愚かなスニペットがあり、それが問題の原因でした。

#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'
# }

これを賞賛し、それは働いた。

8
Sirius

他の人に知らせるためだけに、同じエラーが何度も発生し、REST_FRAMEWORKにカンマを含めるのを忘れていることがわかりました。私はこれを持っていました:

'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated'
),

これの代わりに:

'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated',
),

コンマはこれを one-element Tuple として定義します

105
dbryant4

私の場合、タイプミスはviews.py。の代わりに ...

permission_classes = (permissions.IsAuthenticated,)

...持っていた...

permission_classes = (permissions.IsAuthenticated)
12
Chris

「タイプミス」が原因で、カスタム権限を使用したときにも同じエラーが発生しました

私が持っていた:

@permission_classes(EventByFacilityPermissions)
class EventByFacilityViewSet(viewsets.ModelViewSet):

の代わりに:

@permission_classes((EventByFacilityPermissions,))
class EventByFacilityViewSet(viewsets.ModelViewSet):
6
Marco Silva

一部のクラスだけで認証が必要な場合は、settings.pyではなくクラス内に認証クラスを渡します。次のようにします。

authentication_classes = [TokenAuthentication, ]

このようにする代わりに:

authentication_classes = TokenAuthentication
4
Gregory