Django-Rest-Framework 断言错误 HTTPresponse 预期结果

13

当我在终端上使用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'),
)

3
你应该使用像pdb这样的调试器来逐步执行你的代码,观察控制流程并查看视图返回了什么。 - rubayeet
5个回答

17

在“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 Response instance if request method 
    # is not POST
    return Response({'key': 'value'}, status=status.HTTP_200_OK)

0

只需添加

#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))

0
在我的情况下,通过重新排列api_view()中的方法来解决了问题。
原始代码:
@api_view(['GET', 'POST'])
def startCall(request):

解决方案1 更新的代码:

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

如果没有使用其他方法,可以将其删除

解决方案2 更新的代码:

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

0
我注意到我没有添加request.method,这就是错误的来源。

你的回答可以通过提供更多的支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到更多关于如何撰写好回答的信息。 - undefined
虽然这个链接可能回答了问题,但最好在这里包含答案的关键部分,并提供链接作为参考。仅有链接的答案可能会因为链接页面的更改而失效。- 来自审查 - undefined

0

像下面这样编辑视图应该可以工作

@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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接