首页 > 解决方案 > 现场直播 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']但它以某种方式崩溃。

标签: pythondjangopycharmkeyerrorjsonresponse

解决方案


如果您的托管机器的网络有防火墙,或者不允许连接到 API 的服务器,就会发生这种情况。理想情况下,在假设和阅读之前,response['data']您应该首先检查response.status.


推荐阅读