Django OAuth с Xero SDK не может получить доступ к сессии для oauth2_token_getter и oauth2_token_saver, поскольку не может быть передан объект запроса

Я использую Django с requests_oauthlib для доступа к Xero API с помощью xero-python SDK.

Xero Starter Demo

requests-oauthlib

Я пытаюсь использовать 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')

и нечто подобное для задатчика/сохранителя.

Вернуться на верх