Хороший способ/место для аутентификации Keystone/Openstack API из Django
Это мое первое сообщение на Stackoverflow, и я новичок в Django, надеюсь, вы меня поймете.
Я хочу использовать Django для создания портала с аутентификацией, который должен будет использовать Keystone/Openstack API, для создания/удаления проектов, предоставления/удаления прав.
Openstack предоставляет RestFul API, на котором я должен пройти аутентификацию (я предоставляю учетные данные и получаю обратно токен). У меня есть 2 возможности получить доступ к этому API:
- Использование клиента python: python-keystoneclient .
- Использование непосредственно 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)
Надеюсь, это может кому-то помочь.