Django OAuth с Xero SDK не может получить доступ к сессии для oauth2_token_getter и oauth2_token_saver, поскольку не может быть передан объект запроса
Я использую Django с requests_oauthlib для доступа к Xero API с помощью xero-python SDK.
Я пытаюсь использовать request.session для хранения информации о токене oauth. Это хорошо работает при первоначальном вызове и обратном вызове, но в последующих представлениях, когда я хочу загрузить правильный токен из request.session, я сталкиваюсь с проблемой.
Апиклиент Xero (xero_python.api_client) хочет, чтобы я настроил две функции, которые он может вызвать для получения и сохранения токена в будущем (oauth2_token_getter, oauth2_token_saver) (в демонстрации используются декораторы). Эти функции вызываются API Xero и не принимают никаких параметров. Я могу создать функции без проблем, и они вызываются правильно, но как только я оказываюсь внутри функций, у меня нет объекта запроса, поэтому я не могу получить доступ к request.session, чтобы получить или сохранить токен в сессии.
Демонстрационные проекты Xero используют Flask, который импортирует объект сессии корневого уровня (из flask import session), к которому можно получить доступ в любой функции, так что это прекрасно работает для Flask. Как правильно решить эту проблему в Django?
Я пробовал создать объект SessionStore, но он был пуст, несмотря на то, что я знал, что данные находятся в request.session
Я также пробовал импортировать requests.session, но это, похоже, не то, что я ищу, поскольку я не могу заставить его читать/записывать какие-либо данные.
Некоторый код:
Сохранение токена в обратном вызове работает, так как у меня есть request.session:
def xero_callback(request):
...
request.session["oauth_token"] = token
...
В Xero ApiClient настроены методы для получения и сохранения:
api_client = ApiClient(
Configuration(
debug=True,
oauth2_token=OAuth2Token(client_id=config.XERO_CLIENT_ID, client_secret=config.XERO_CLIENT_SECRET),
),
pool_threads=1,
oauth2_token_getter=oauth2_token_getter,
oauth2_token_saver=oauth2_token_saver)
Это не работает, поскольку у меня нет объекта запроса и я не могу передать его:
def oauth2_token_getter():
return request.session.get("token") #! FAIL, I don't have access to request here
Ошибка возникает после вызова identity_api.get_connections(), поскольку он пытается получить токен с помощью oauth2_token_getter и терпит неудачу
def xero_tenants(request):
identity_api = IdentityApi(api_client)
accounting_api = AccountingApi(api_client)
available_tenants = []
for connection in identity_api.get_connections():
...
Любая помощь приветствуется, спасибо
Вы можете хранить токен в кэше django? (django.core.cache import cache
) Тогда вместо указания oauth2_token_getter=oauth2_token_getter
в конструкторе ApiClient вы можете сделать:
@api_client.oauth2_token_getter
def obtain_xero_oauth2_token():
return cache.get('token')
и нечто подобное для задатчика/сохранителя.