使用 Django 在循环中进行多次 API 调用和更新
Make multiple API calls and update in a loop using Django
我正在尝试进行 API 调用,并且能够在我使用给定输入请求它时使其正常工作(因此返回一条记录,并对该记录进行 API 调用记录)从表格。现在,如果未提供输入,我想遍历实际 table 中的所有行,并对任何缺失的数据列进行 API 调用...
但是,当我尝试在同一页面上发出多个请求时,在表单提交时,我无法让 api 调用正常工作,我收到此错误:
JSONDecodeError 在 /url
期望值:第 1 行第 1 列(字符 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 in raw_decode, line 355
Python 执行table: C:\Users\.virtualenvs\projects\Scripts\python.exe
更新:这是 API 失败,而不是 Django。由于批量更新不起作用
,所以留下问题的其余部分
进行 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..
路径('api//',views.API.as_view(),名称='a')
我需要从 Django 中进行此 API 调用(因为调用基于返回的内容)所以我不能为此使用 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 在第二条记录上失败。但是,multiple/bulk 更新以使用从 API 返回的数据设置特定列不起作用。
MyModel.objects.update(columToUpdate = apiData['field'])
不能循环使用。我验证了循环确实调用了更新。
对于阅读此问题的任何其他人,请注意我是 Django 新手并且可能使用了一些有问题的做法。但是,问题中的代码上的所有内容都可以正常工作,只要您想到以下几点:
- 想想边缘情况,例如,如果 API 没有 return 任何东西。 Return '' 或 None 之类的,然后在处理数据字段之前检查是否有 returned。添加一个 try 异常部分,这样如果 API 确实出错了,您可以 return 返回一些内容。
- Django .update 无法在同一列具有不同数据值的循环中工作,因此请改为:
来自 django.db 进口交易
@staticmethod
def updateBulk(id, newValue):
rows = MyModel.objects.filter(id=id)
transaction.set_autocommit(False)
for row in rows:
row.column1 = newValue
row.save()
transaction.commit()
transaction.set_autocommit(True)
我正在尝试进行 API 调用,并且能够在我使用给定输入请求它时使其正常工作(因此返回一条记录,并对该记录进行 API 调用记录)从表格。现在,如果未提供输入,我想遍历实际 table 中的所有行,并对任何缺失的数据列进行 API 调用...
但是,当我尝试在同一页面上发出多个请求时,在表单提交时,我无法让 api 调用正常工作,我收到此错误:
JSONDecodeError 在 /url
期望值:第 1 行第 1 列(字符 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 in raw_decode, line 355
Python 执行table: C:\Users\.virtualenvs\projects\Scripts\python.exe
更新:这是 API 失败,而不是 Django。由于批量更新不起作用
,所以留下问题的其余部分进行 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..
路径('api//',views.API.as_view(),名称='a')
我需要从 Django 中进行此 API 调用(因为调用基于返回的内容)所以我不能为此使用 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 在第二条记录上失败。但是,multiple/bulk 更新以使用从 API 返回的数据设置特定列不起作用。
MyModel.objects.update(columToUpdate = apiData['field'])
不能循环使用。我验证了循环确实调用了更新。
对于阅读此问题的任何其他人,请注意我是 Django 新手并且可能使用了一些有问题的做法。但是,问题中的代码上的所有内容都可以正常工作,只要您想到以下几点:
- 想想边缘情况,例如,如果 API 没有 return 任何东西。 Return '' 或 None 之类的,然后在处理数据字段之前检查是否有 returned。添加一个 try 异常部分,这样如果 API 确实出错了,您可以 return 返回一些内容。
- Django .update 无法在同一列具有不同数据值的循环中工作,因此请改为:
来自 django.db 进口交易
@staticmethod
def updateBulk(id, newValue):
rows = MyModel.objects.filter(id=id)
transaction.set_autocommit(False)
for row in rows:
row.column1 = newValue
row.save()
transaction.commit()
transaction.set_autocommit(True)