有没有办法对远程会话进行身份验证以抓取数据并保持身份验证,而不是在每个请求中都进行身份验证?

时间:2019-02-06 21:28:26

标签: python rest jenkins

我有一个python脚本从jenkins api抓取数据。问题是该脚本在每个请求时都进行身份验证,并且性能不高。我想进行一次身份验证,并能够根据自己的喜好查询数据。

有可能吗?

import requests
from basicauth import encode
from pprint import pprint
import json


class JenkinsInfo(object):

    defaultHeader = {
    'Accept': 'application/json, */*',
    'content-type': 'application/json',
    'Authorization': ''
    }

    def __init__(self, url, user, password):
        self.jenkins_url = url.rstrip("/")
        self.jenkins_user = user
        self.jenkins_password = password
        self.s = requests.Session()
        self.ssl_verify = ssl_verify
        self.defaultHeader['Authorization'] = encode(user, password)

#### the script below is the one that call previous class ###  

from prometheus_client import start_http_server,Counter
from conf_example import JENKINS_URL, JENKINS_USER, 
JENKINS_PASSWORD
from jenkins_metrics import JenkinsInfo
import time
from sys import exit


def main():
    print("Starting Jenkins Metrics")
    jenkins = JenkinsInfo(JENKINS_URL, JENKINS_USER, JENKINS_PASSWORD)

1 个答案:

答案 0 :(得分:0)

是的,您需要获取一个cookie。确保在整个运行过程中使用相同的会话对象,并仅使第一个请求成为登录请求。不确定Jenkins进行登录需要什么,但是您可能可以从jenkinsapi项目或执行相同操作的其他软件中获得一些好主意。从他们那里复制的代码:

login_url = 'j_acegi_security_check'
jenkins_url = '{0}/{1}'.format(self.baseurl, login_url)
data = urlencode({'j_username': self.username,
                  'j_password': self.password}).encode("utf-8")

请注意,它们会执行某些用例中可能不需要的操作。还可以考虑实际使用该库或类似的库,而不是从头开始编写自己的代码。