python - 现场直播 django KeyError,使用 pycharm 在车站上工作
问题描述
好的,下面的代码从实时主机和本地 venv 上的 pycharm 编辑器“对话”到同一个restapi。其他所有代码和其他请求音在这里和这里都可以正常工作。
奇怪的是,以下代码manage.py runserver
由 pycharm 在本地 venv 上启动,但不适用于 apache+django 的实时主机。
视图.py
def host_tst_online(request):
abc_hosts = Host.objects.all()
tsthost = Host.objects.filter(abcenv='tst').order_by('abchostname')
tsthostonline = []
arr = []
for xyz in tsthost:
try:
requests.get(
'https://{}:6666/abc/api/v1/about'.format(xyz),
verify='/cert/cacerts.pem',
headers={'Accept': 'application/json', 'Authorization': 'Basic xxxxxxxxxxxxxxxxx'}, timeout=1
)
tsthostonline.append(xyz)
except (ConnectionError, ConnectTimeout) as e:
print(e)
response = "No response"
if request.method == 'POST':
send_form = SendersFormO(request.POST)
recv_form = ReceiversFormO(request.POST)
if send_form.is_valid():
abcsend = send_form.cleaned_data.get('abcsend')
send_form = SendersFormO()
for eee in tsthostonline:
response = requests.get(
'https://{}:6666/abc/api/v1/objects/abcsend?id={}'.format(eee, abcsend),
verify='/cert/cacerts.pem',
headers={'Accept': 'application/json', 'Authorization': 'Basic xxxxxxxxxxxxxxxxxx'},
).json()
for key in response['data']:
arr.append(key)
context = {'response': response, 'arr': arr, 'send_form': send_form, 'tsthostonline': tsthostonline}
return render(request, 'app/json_nest_send_online.html', context)
if recv_form.is_valid():
abcrecv = recv_form.cleaned_data.get('abcrecv')
recv_form = ReceiversFormO()
for eee in tsthostonline:
response = requests.get(
'https://{}:6666/abc/api/v1/objects/abcrecv?id={}'.format(eee, abcrecv),
verify='/cert/cacerts.pem',
headers={'Accept': 'application/json', 'Authorization': 'Basic xxxxxxxxxxxxxxxxxxx'},
).json()
for key in response['data']:
arr.append(key)
context = {'response': response, 'arr': arr, 'recv_form': recv_form, 'tsthostonline': tsthostonline}
return render(request, 'app/json_nest_recv_online.html', context)
else:
send_form = SendersFormO()
recv_form = ReceiversFormO()
context = {'response': response, 'send_form': send_form, 'recv_form': recv_form, 'abc_hosts': abc_hosts, 'tsthost': tsthost}
return render(request, 'app/host_tst_online.html', context)
json_nest_send_online.html
[...]
{% if response %}
{% for key in arr %}
<div class="border w-100"></div>
<div style="width: 200px;">{{ key.links.self|host_cut }}</div>
<div style="width: 100px;">{{ key.type }}</div>
<div style="width: 150px;">{{ key.id }}</div>
{% endfor %}
</div>
<hr>
{% else %}
<p>No IDs are available.</p>
{% endif %}
[...]
请求相同restapi的相同代码(网络和restapi的一切都很好)
怎么可能
在实时主机上出现以下错误,但在从本地venv午餐时工作:
KeyError at /app/host_tst/
'data'
我可以看到该arr
变量已填充response['data']
但它以某种方式崩溃。
解决方案
如果您的托管机器的网络有防火墙,或者不允许连接到 API 的服务器,就会发生这种情况。理想情况下,在假设和阅读之前,response['data']
您应该首先检查response.status
.