Это мой первый вопрос, пожалуйста, несите меня. Я работаю с API, который аутентифицируется с использованием токена доступа, срок действия которого истекает через 15 минут, а токен обновления не используется для повторного входа в систему. До сих пор я был в состоянии получить маркер доступа и вставить его в requests.get
вызова, но я не могу показаться, чтобы заставить его возобновить, и я в недоумении относительно того, каким образом. Вся работа с этим API и, в общем, с Python, поэтому я надеюсь сохранить его на Python повсюду и в том же файле.
Я получаю код сообщения 401
после того, как закончится 15 минут, и код 200
будет успешным. До сих пор мои единственные идеи заключались в том, чтобы поместить его в таймер для обновления, но я не могу делать заголовки или заголовки записей stackoverflow или документации по этому поводу, иметь вход, выполняемый в отдельном скрипте, а затем этот сценарий вызывает другой для текущего (но для этого все еще требуется таймер), или вызвать вызов для повторного входа в систему после того, как он обратится к response.status_code != 200
.
Пример скрипта для получения токена доступа
import requests, os, json, time, csv
def login (url, payload):
#this will log into API and get an access token
auth = requests.post(url, data=payload).json()
sessionToken = auth["token"]
sessionTimer = auth["validFor"]
headers = {'Access-Token': sessionToken}
return headers
#calling the function to generate the token
if __name__ == '__main__':
url = "url inserted here"
u = input("Enter your username: ")
p = input("Enter your password: ")
t = input("Enter your tenancy name: ")
payload = {'username': u, 'password': p, 'tenant': t}
print("Logging in")
headers = login(url, payload)
#the actual work as pulled from a csv file
valuables = input("CSV file with filepath: ")
file = open(valuables, 'r', encoding='utf-8')
csvin = csv.reader(file)
for row in csvin:
try:
uuidUrl = row[0]
output_file = row[1]
response = requests.get(uuidUrl, headers=headers)
print(response.status_code)
with open(output_file, 'wb') as fd:
for chunk in response.iter_content(chunk_size=128):
fd.write(chunk)
fd.close()
except requests.exceptions.RequestException:
print(output_file,"may have failed")
login(url, payload)
continue
Я не смог получить его, чтобы успешно распознать if response.status_code != 200:
как способ перезвонить на login(). Я также не мог заставить его выйти из while True:
loop.
Прошу прощения, я не могу дать более подробную информацию о доступе к API для других людей, чтобы попробовать. Он не является общедоступным
В конце концов я смог выяснить ответ на свой вопрос. Публикация этого для более поздних пользователей. Обновленный фрагмент ниже.
Короткий вариант истории: request.status_code отправил обратно целое число, но я сделал ошибочное предположение, что это будет строка, поэтому мое внутреннее сравнение не было хорошим.
for row in csvin:
try:
uuidUrl = row[0]
xip_file = row[1]
response = requests.get(uuidUrl, headers=headers)
status = response.status_code
print(status)
if status == 401:
print(xip_file, "may have failed, loggin back in")
login(url, payload)
headers = login(url, payload)
response = requests.get(uuidUrl, headers=headers)
with open(xip_file, 'wb') as fd:
for chunk in response.iter_content(chunk_size=128):
fd.write(chunk)
fd.close()
else:
with open(xip_file, 'wb') as fd:
for chunk in response.iter_content(chunk_size=128):
fd.write(chunk)
fd.close()
except requests.exceptions.RequestException:
print(xip_file,"may have failed")
headers = login(url, payload)
continue
login()
внизу, но нигде не назначаете результат. Вам нужно переназначитьheaders = login(url, payload)