首页 > 解决方案 > 使用python请求模块时未发送保持活动消息

问题描述

我观察到使用 python 请求模块,HTTP keep-alive 没有得到尊重。我没有看到从运行 python 脚本的主机发送 Acks for keep-alive。

请让我知道如何修复它。以下是我的代码:

import json
import requests
import logging
import sys
import time
from threading import Thread
logging.basicConfig(level=logging.DEBUG)
class NSNitro:
    def __init__(self,*args):
        if len(args) > 2:
            self.ip = args[0]
            self.username = args[1]
            self.password = args[2]
            self.session_id = None
            url = 'http://'+self.ip+'/nitro/v1/config/login'
            payload = {  "login": {    "username":"nsroot",    "password":"nsroot" }}
            headers = {"Content-type": "application/json", 'Connection': 'keep-alive'}
            try:
                r = requests.post(url=url,headers=headers,data=json.dumps(payload),timeout=5)
                logging.info(r.json()["sessionid"])
                if(r.json()["sessionid"] != None):
                    self.session_id = r.json()["sessionid"]
            except requests.exceptions.RequestException:
                logging.critical("Some error occurred during connection")
        else:
            logging.error("Not sufficient parameters provided.Required : ipaddress , username , password")

    def install_build(self,build_url):
        url = 'http://ip/nitro/v1/config/install'
        headers = {"Content-type": "application/json","Connection": "keep-alive"}
        payload = {"install": {"url": build_url}}
        try:
            cookie = {"NITRO_AUTH_TOKEN": self.session_id}
            r = requests.post(timeout=5, url=url, data=json.dumps(payload), headers=headers,cookies=cookie)
        except requests.exceptions.RequestException:
            print("Connection Error occurred")
            raise '''this will give details of exception'''
        else:
            assert r.status_code == 201, "Status code seen: " + str(r.status_code) + "\n" + "Error message from system: " + \
                             r.json()["message"]
            print("Successfully triggered job on device to install build")


    def __del__(self):
        logging.debug("Deleted the object")

if __name__ == '__main__':
    ns_session = NSNitro(ip,username,password)
    url_i = 'https://myupload-server.net/build-13.0-480.16.tgz'
    t1 = Thread(target=ns_session.install_build,args=(url_i,))
    t1.start()
    ''' while t1.is_alive():
        t2 = Thread(target=ns_session.get_installed_version,)
        t2.start()
        t2.join()'''
    time.sleep(100)
    logging.info("Install thread completed")
    t1.join()
    ns_session.logout()

当使用 curl 命令发布请求时,会以指定的保持活动间隔发送确认。在没有发送 ack 的情况下,服务器正在重置连接。

标签: pythoncurlpython-requestskeep-alive

解决方案


推荐阅读