【问题标题】:TypeError while using django rest framework tutorial使用 django rest 框架教程时出现 TypeError
【发布时间】:2013-12-29 10:11:39
【问题描述】:

我是使用 Django Rest 框架的新手,我正在关注本教程 Django-Rest-Framework

我的模型不是 sn-ps,而是由一个用户配置文件组成,如下所示:

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

其余代码与上述链接中的第二部分和第三部分几乎相同: 视图.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 版。

提前致谢

【问题讨论】:

  • 似乎 permission_classes 在您的 UserProfileList 课程中设置为 None。但是您在此处显示的代码不应该发生这种情况,因为它在views.APIView 中设置为api_settings.DEFAULT_PERMISSION_CLASSES,generics.GenericAPIView 继承自该代码。您是否在任何地方覆盖了设置?
  • @DanielRoseman:是的,这就是问题所在,非常感谢队友:),实际上我遵循了快速教程,其中有这个'DEFAULT_PERMISSION_CLASSES': # 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'。评论了这个,它起作用了。

标签: python django rest typeerror django-rest-framework


【解决方案1】:

为了让其他人知道,我一直收到同样的错误,发现我忘记在REST_FRAMEWORK 中包含逗号。我有这个:

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

而不是这个:

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

逗号将其定义为one-element tuple

【讨论】:

  • 你帮我省了很多挫折!
  • 我认为 Python 需要尾随逗号才能将表达式识别为 1 元素元组,而不仅仅是括号中的正则表达式:wiki.python.org/moin/TupleSyntax
  • 太棒了!我最初删除了那个逗号,因为我认为它是一个错字。感谢您的提示!
  • 读到这个是我这么长时间以来最幸运的事情了
  • 感谢您对我的帮助很大!
【解决方案2】:

在我的例子中,错字在views.py。而不是...

permission_classes = (permissions.IsAuthenticated,)

...我有...

permission_classes = (permissions.IsAuthenticated)

【讨论】:

    【解决方案3】:

    正如上面 Daniel 所指出的,我在设置文件中有这个愚蠢的 sn-p,这是导致问题的原因,

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

    评论了这个并且它起作用了。

    【讨论】:

      【解决方案4】:

      我在使用自定义权限时遇到了同样的错误,因为“错字”

      我有:

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

      代替:

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

      【讨论】:

        【解决方案5】:

        如果您只需要在某些类中进行身份验证,则在您的类中而不是在您的 settings.py 中传递身份验证类,并这样做:

        authentication_classes = [TokenAuthentication, ]
        

        而不是这样:

        authentication_classes = TokenAuthentication
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-03
          • 1970-01-01
          • 2013-04-10
          • 1970-01-01
          • 2013-01-03
          • 1970-01-01
          • 2018-10-16
          • 1970-01-01
          相关资源
          最近更新 更多