django休息框架OPTIONS 500

时间:2015-06-03 18:22:37

标签: django django-rest-framework

在使用Django Rest Framework构建的API中向端点发出OPTION请求时,我遇到了一个奇怪的500错误。 GET,POST,PUT一切正常,不允许DELETE。

当向端点发出OPTION请求时,我收到以下错误和回溯:

Traceback:
File "/Users/awwester/Sites/django/rlg/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/awwester/Sites/django/rlg/lib/python3.4/site-packages/django/views/decorators/csrf.py" in wrapped_view
  57.         return view_func(*args, **kwargs)
File "/Users/awwester/Sites/django/rlg/lib/python3.4/site-packages/rest_framework/viewsets.py" in view
  85.             return self.dispatch(request, *args, **kwargs)
File "/Users/awwester/Sites/django/rlg/lib/python3.4/site-packages/rest_framework/views.py" in dispatch
  452.             response = self.handle_exception(exc)
File "/Users/awwester/Sites/django/rlg/lib/python3.4/site-packages/rest_framework/views.py" in dispatch
  449.             response = handler(request, *args, **kwargs)
File "/Users/awwester/Sites/django/rlg/lib/python3.4/site-packages/rest_framework/views.py" in options
  463.         data = self.metadata_class().determine_metadata(request, self)
File "/Users/awwester/Sites/django/rlg/lib/python3.4/site-packages/rest_framework/metadata.py" in determine_metadata
  63.             actions = self.determine_actions(request, view)
File "/Users/awwester/Sites/django/rlg/lib/python3.4/site-packages/rest_framework/metadata.py" in determine_actions
  89.                 actions[method] = self.get_serializer_info(serializer)
File "/Users/awwester/Sites/django/rlg/lib/python3.4/site-packages/rest_framework/metadata.py" in get_serializer_info
  106.             for field_name, field in serializer.fields.items()
File "/Users/awwester/Sites/django/rlg/lib/python3.4/site-packages/rest_framework/metadata.py" in <listcomp>
  106.             for field_name, field in serializer.fields.items()
File "/Users/awwester/Sites/django/rlg/lib/python3.4/site-packages/rest_framework/metadata.py" in get_field_info
  129.         if hasattr(field, 'choices'):
File "/Users/awwester/Sites/django/rlg/lib/python3.4/site-packages/rest_framework/relations.py" in choices
  382.             for item in iterable

Exception Type: TypeError at /v1/powerChatSessions
Exception Value: 'NoneType' object is not iterable

以下是模型,序列化程序和视图:

# models.py - error happens when issuing OPTIONS /powerChatSession
class VideoConversation(models.Model):
    """
    Capture data about a video chat session
    SO note: this is inherited by other classes besides PowerChat
    """
    created = models.DateTimeField(auto_now_add=True)
    end = models.DateTimeField(null=True, blank=True)
    users = models.ManyToManyField(User)

class PowerChat(VideoConversation):
    """
    power chat session
    """
    start = models.DateTimeField(null=True, blank=True)
    extended = models.BooleanField(default=False)
    active = models.BooleanField(default=False)


# serializers.py
class PowerChatSerializer(serializers.ModelSerializer):

    class Meta:
        model = PowerChat
        read_only_fields = ('users', 'start', 'extended',)

# views.py
class PowerChatViewSet(ModelViewSet):
    queryset = PowerChat.objects.all()
    permission_classes = (PowerChatPermission,)
    serializer_class = PowerChatSerializer
    resource_name = "powerChatSession"

为什么会发生这种情况?它与用户字段有关,似乎它可能是Django Rest Framework的一个错误?它正在检查该字段是否有选择kwarg,但它没有,但显然DRF认为它确实存在?

1 个答案:

答案 0 :(得分:0)

我认为这个问题已经解决了:

https://github.com/tomchristie/django-rest-framework/issues/3115

要点是“目前,如果我收到OPTIONS请求,则self.action在视图集中为无。”

升级到djangorestframework-3.2.3

后,这个问题停止了