【问题标题】:Django-Rest-Framework AssertionError HTTPresponse ExpectedDjango-Rest-Framework AssertionError HTTPresponse Expected
【发布时间】:2014-04-27 06:16:20
【问题描述】:

当我使用 curl 在终端上执行以下命令时

curl -X POST http://myuser:mypassword@myweb.com:8000/call/make-call/ -d "tutor=1&billed=1"

我收到以下错误

/call/make-call/ 处的 AssertionError 应为 ResponseHttpResponseHttpStreamingResponse 从 查看,但收到了<type 'NoneType'>

我的views.py是

@api_view(['GET', 'POST'])
def startCall(request):

    if request.method == 'POST':

        serializer = startCallSerializer(data=request.DATA)

        if serializer.is_valid():

            serializer.save()

            return Response(serializer.data, status=status.HTTP_201_CREATED)

        else:

            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我的 serializer.py 是

class startCallSerializer(serializers.ModelSerializer):

    class Meta:
        model = call
        fields = ('tutor', 'billed', 'rate', 'opentok_sessionid')

我的 urls.py 是

urlpatterns = patterns(
    'api.views',
    url(r'^call/make-call/$','startCall', name='startCall'),
)

【问题讨论】:

  • 您应该使用像 pdb 这样的调试器来单步调试您的代码,观察控制流并查看视图返回的内容。

标签: python django-rest-framework


【解决方案1】:

函数不会在“GET”请求中返回Response 对象。即if request.method == 'POST'分支检查不通过。

@api_view(['GET', 'POST'])
def startCall(request):

    if request.method == 'POST':
        serializer = startCallSerializer(data=request.DATA)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
             return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    #Return this if request method is not POST
    return Response({'key': 'value'}, status=status.HTTP_200_OK)

【讨论】:

    【解决方案2】:

    只需添加

    #Return this if request method is not POST
        return Response(json.dumps({'key': 'value'},default=json_util.default))
    

    如果您的应用程序开发中没有内置错误代码。

    我的完整代码:

    @csrf_exempt
    @api_view(['GET','POST'])
    def uploadFiletotheYoutubeVideo(request):
        if request.method == 'POST': 
            file_obj = request.FILES['file']#this is how Django accepts the files uploaded. 
            print('The name of the file received is ')
            print(file_obj.name)
            posteddata = request.data
            print("the posted data is ")
            print(posteddata)
            response = {"uploadFiletotheYoutubeVideo" : "uploadFiletotheYoutubeVideo"}
            return Response(json.dumps(response, default=json_util.default))
        #Return this if request method is not POST
        return Response(json.dumps({'key': 'value'},default=json_util.default))
    

    【讨论】:

      【解决方案3】:

      编辑如下视图应该可以工作

      @api_view(['GET', 'POST'])
      def startCall(request):
          if request.method == 'POST':
          serializer = startCallSerializer(data=request.data)
          data={}
          if serializer.is_valid():
              datas = serializer.save()
              data['tutor']=datas.tutor
              data['billed']=datas.billed
              data['rate']=datas.rate
      
      
          else:
              return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
          return Response(data)
      

      【讨论】:

        【解决方案4】:

        在我的例子中,它是通过重新排序 api_view() 中的方法来解决的

        原代码:

        @api_view(['GET', 'POST'])
        def startCall(request):
        

        解决方案 1 更新代码:

        @api_view(['POST', 'GET'])
        def startCall(request):
        

        如果不使用则删除其他方法

        解决方案 2 更新代码:

        @api_view(['POST'])
        def startCall(request):
        

        【讨论】:

          猜你喜欢
          • 2015-05-31
          • 2016-06-19
          • 1970-01-01
          • 2022-12-05
          • 1970-01-01
          • 2021-10-27
          • 2016-06-02
          • 2019-05-12
          • 1970-01-01
          相关资源
          最近更新 更多