Хороший способ/место для аутентификации Keystone/Openstack API из Django

Это мое первое сообщение на Stackoverflow, и я новичок в Django, надеюсь, вы меня поймете.

Я хочу использовать Django для создания портала с аутентификацией, который должен будет использовать Keystone/Openstack API, для создания/удаления проектов, предоставления/удаления прав.

Openstack предоставляет RestFul API, на котором я должен пройти аутентификацию (я предоставляю учетные данные и получаю обратно токен). У меня есть 2 возможности получить доступ к этому API:

  1. Использование клиента python: python-keystoneclient
  2. .
  3. Использование непосредственно restfulAPI

Неважно, вариант 1 или 2, я могу войти и взаимодействовать с API, я делаю это в представлении.

Моя проблема в том, что каждый раз, когда я меняю страницу/представление, мне приходится снова проходить аутентификацию. Я не знаю, как использовать/обмениваться "сессией или объектом клиента" в других представлениях.

>>> from keystoneauth1.identity import v3
>>> from keystoneauth1 import session
>>> from keystoneclient.v3 import client
>>> auth = v3.Password(auth_url='https://my.keystone.com:5000/v3',
...                    user_id='myuserid',
...                    password='mypassword',
...                    project_id='myprojectid')
>>> sess = session.Session(auth=auth)
>>> keystone = client.Client(session=sess, include_metadata=True)

Я пытался передать объект в качестве переменной сессии с помощью request.session и request.session.get, но объект не сериализуем. Я сериализовал его, но не могу использовать его в другом представлении.

Может быть, мне не следует обращаться к API в представлении? Я уверен, что я не первый в этом usecase, независимо от удаленного API. Но я много гуглил и не нашел подходящего способа. Может быть, я не искал с правильными словами

Спасибо за помощь.

Я сделал это следующим образом, и это работает хорошо:

в apps.py:

from django.apps import AppConfig
from keystoneauth1.identity import v3
from keystoneauth1 import session
from keystoneclient.v3 import client

class MyAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'mySharedVar'
    auth = v3.Password(auth_url='https://my.keystone.com:5000/v3', user_id='myuserid', password='mypassword',project_id='myprojectid')
    ses1 = session.Session(auth=auth)

в моих представлениях я теперь могу получить доступ к "переменной share" с помощью:

from keystoneauth1.identity import v3
from keystoneauth1 import session
from keystoneclient.v3 import client

@login_required
def list_project(request):
    sharedVar=apps.get_app_config('mySharedVar')
    keystone = client.Client(session=sharedVar.ses1, include_metadata=True)
    pl = keystone.projects.list()
    context = {
        "title": "Project List",
        "projects": pl.data
    }
    return render(request, "myapp/list_project.html",context=context)

Надеюсь, это может кому-то помочь.

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