Я пытаюсь сделать вызов API и могу заставить его работать, когда я запрашиваю его с заданным входом (возвращая одну запись и делая вызов API для этой одной записи) из формы.Теперь, если входные данные не предоставлены, я хочу перебрать все строки в фактической таблице и выполнить вызовы API для любых отсутствующих столбцов данных ...
Однако, когда я пытаюсь сделать несколько запросов для одного и того жестраница, при отправке формы, я не могу заставить вызов API работать, я получаю эту ошибку:
JSONDecodeError at / url Ожидаемое значение: строка 1, столбец 1 (char 0) Метод запроса: POST URL запроса:http://localhost:8000/url Версия Django: 2.1.1 Тип исключения: JSONDecodeError Значение исключения:
Ожидаемое значение: строка 1, столбец 1 (символ 0) Расположение исключения: C: \ Users \ AppData \ Local \ Programs \ Python \ Python37-32 \ Lib \ json \ decoder.py в raw_decode, строка 355 Исполняемый файл Python: C: \ Users \ .virtualenvs \ projects \ Scripts \ python.exe
ОБНОВЛЕНИЕ: Это был сбой API,не Джанго.Оставляя остальную часть вопроса в виде массовых обновлений, не работают
представления для вызова API:
class API(View):
def get(self, request, *args, **kwargs):
url = 'https://ExternalAPI/{param1}'.format(param1=param1)
response = requests.get(url, headers={'x-Key': settings.KEY})
if response.status_code == 404:
return JsonResponse({})
return JsonResponse(response.json()[0])
# Works for 1 row, doesn't work when called within a loop from a form submission....
def getAnotherAPICall(self, request, address):
print('getting data...')
response = requests.get('{}?param={}&id={}'.format(settings.URL, data, settings.ID))
data = response.json()
result = data['Response'][0] # This is based on the API itself....
if response.status_code == 404:
return {}
return result
Нет URL для пользовательского метода.
path ('api //', views.API.as_view (), name = 'a')
Мне нужно сделать этот вызов API из Django (так как вызовы основаны на том, чтовозвращается), поэтому я не могу использовать Javascript или внешний интерфейс для этого ..
class MyView(TemplateView):
def post(self, request):
form = MyForm(request.POST)
formIDInput = form.cleaned_data['formIDInput']
apiData = []
if form.is_valid():
if(formIDInput):
resultQuerySet = MyModel.objects.filter(PrimaryID= str(formIDInput)) # One row, API call works
else
resultQuerySet = MyModel.objects.all() #Multiple rows, API call doesn't work when API call is made
for result in resultQuerySet:
# This step fails:
apiData = API.getAnotherAPICall(self, request, result.column1) # result.column1 is parameter to make the API call...
apiData.append({
'ID': result.PrimaryID,
'Data': apiData
})
MyModel.objects.update(columToUpdate = apiData['field'])
return render(request, 'template.html', {
'form': form,
'results': resultQuerySet
})
ОБНОВЛЕНИЕ: Итак, я понял, что цикл работает нормально.Сбой API на второй записи, когда цикл проходил нормально.Однако многократное / массовое обновление для установки определенных столбцов с использованием данных, возвращаемых из API, не работает.
MyModel.objects.update(columToUpdate = apiData['field'])
не работает в цикле.Я подтвердил, что цикл вызывает обновление.