Передача аргументов как объекта json - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь связать свое веб-приложение django с API Azure ML.У меня есть форма Django со всеми необходимыми входными данными для моего API Azure.

def post(self,request):
    form = CommentForm(request.POST)
    url = 'https://ussouthcentral.services.azureml.net/workspaces/7061a4b24ea64942a19f74ed36e4b438/services/ae2c257d6e164dca8d433ad1a1f9feb4/execute?api-version=2.0&format=swagger'

    api_key = # Replace this with the API key for the web service

    headers = {'Content-Type':'application/json', 'Authorization':('Bearer '+ api_key)}

    if form.is_valid():
        age = form.cleaned_data['age']
        bmi = form.cleaned_data['bmi']
    args = {"age":age,"bmi":bmi}
    json_data = str.encode(json.dumps(args))
    print(type(json_data))

    r= urllib.request.Request(url,json_data,headers)
    try:
        response = urllib.request.urlopen(r)
        result = response.read()
        print(result) 
    except urllib.request.HTTPError as error:
        print("The request failed with status code: " + str(error.code))
        print(json_data)
        # Print the headers - they include the requert ID and the timestamp, which are useful for debugging the failure
        print(error.info())

        print(json.loads(error.read()))      
    return render(request,self.template_name)

Когда я пытаюсь отправить форму, я получаю сообщение об ошибке типа -

TypeError('POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.',)

Получение кода состояния -Ошибка 400 и ниже

{'error': {'code': 'BadArgument', 'message': 'Invalid argument provided.', 'details': [{'code': 'RequestBodyInvalid', 'message': 'No request body provided or error in deserializing the request body.'}]}}

Аргументы используют print (json_data) -

b'{"age": 0, "bmi": 22.0}'

Может кто-нибудь помочь мне в этом?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Спасибо всем. Я обнаружил ошибку, это были данные, которые были не в правильном порядке.

0 голосов
/ 17 января 2019

Попробуйте использовать JsonResponse:

https://docs.djangoproject.com/en/2.1/ref/request-response/#jsonresponse-objects

Кроме того, я не думаю, что вам нужен шаблон для ответа API.

return JsonResponse({'foo': 'bar'})
...