在多个功能中使用身份验证凭据

时间:2015-12-22 17:00:57

标签: python authentication python-requests

我正在编写一个脚本,该脚本使用请求库从需要身份验证的网站获取API数据。根据我的理解和测试,该网站似乎没有使用授权保存的cookie,因此每个请求都需要进行身份验证,例如:

page = requests.get('http://a_url.com', auth=(uname, pword))

这对于我需要的除了以外,我将特定的任务拆分成单独的函数,以不同的方式处理不同的数据。唯一的共同点就是他们所有需要用户名和密码(在命令行中获得),所以我最终只是缺少了所有的功能" uname"和" pword"作为他们的第一个参数,然后是任何其他必要的参数:

def get_all_projects(uname, pword):
    # function

def get_single_project(uname, pword, project_name):
    # function

def get_select_projects(uname, pword, projects):
    for project in projects:
        get_single_project(uname, pword, project)

# Etc...

除了将脚本转换为类之外,还有其他方法可以将凭据传递给需要它们的函数而无需对它们进行参数化吗? Requests.Session()不会起作用,因为如上所述,我需要在每次调用get时包含auth。我觉得装饰师会很好地适应这种情况,但我不能很好地理解它们,但能够证实这种信念。

1 个答案:

答案 0 :(得分:0)

正如@barny指出的那样,我错过了确实通过以下方式(来自docs和barny的评论)将身份验证传递给requests.Session()的事实:< / p>

s = requests.Session()
s.auth = (uname, pword)

所以来自op的url请求现在可以是:

page = s.get('http://a_url.com')

只要会话处于活动状态,就会自动包含auth。

除此之外,我的函数现在可以简化为只使用会话对象作为参数而不是每次使用用户名和密码:

def get_all_projects(s):
    # function

def get_single_project(s, project_name):
    # function

def get_select_projects(s, projects):
    for project in projects:
        get_single_project(s, project)

# Etc...