api令牌应如何传递给函数?

时间:2019-06-02 17:24:33

标签: python

在我的主要功能中,我从环境变量中获取API令牌。我应该使用global还是将其作为使用api_token的所有函数的参数传递?

def main():
    api_token = os.environ.get('API_TOKEN')

def request_data():
    url = 'https://api.example.com/search'
    headers = {'Authorization': 'token {}'.format(api_token)
    params = {}
    r = requests.get(url, params=params, headers=headers)

def update_data():
    url = 'https://api.example.com/update'
    headers = {'Authorization': 'token {}'.format(api_token)
    data = {}
    r = requests.put(url, data=json.dumps(data), headers=headers)

2 个答案:

答案 0 :(得分:1)

使用类封装请求逻辑怎么样?

def main():
    api_token = os.environ.get('API_TOKEN')
    api = Api(api_token)
    api.request_data()

class Api(object):
    def __init__(self, token):
        self.token = token

    def request_data(self):
        url = 'https://api.example.com/search'
        header = {'Authorization': 'token {}'.format(self.token)
        params = {}
        r = requests.get(url, params=params, headers=headers)

    def update_data(self):
        url = 'https://api.example.com/update'
        header = {'Authorization': 'token {}'.format(self.token)
        data = {}
        r = requests.put(url, data=json.dumps(data), headers=headers)

答案 1 :(得分:0)

在这种情况下,使用requests.Session()真的很有帮助:

不更新标题的示例:

s = requests.Session()  # Start session

resp = s.get("http://httpbin.org/headers")

print(resp.json()["headers"])

哪个输出默认标题:

{'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.18.4'}

现在,如果您想添加类似api_token的内容,则可以使用s.headers.update()

s.headers.update({"Auth": "Authkey"})

resp = s.get("http://httpbin.org/headers")

print(resp.json()["headers"])

新输出:

{'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Auth': 'Authkey', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.18.4'}

现在,在开始新的会话之前,添加到标题中的所有内容都会保留!