【问题标题】:Good way/place to authenticate Keystone/Openstack API from Django从 Django 验证 Keystone/Openstack API 的好方法/地方
【发布时间】:2023-01-04 23:58:40
【问题描述】:
这是我在 Stackoverflow 上的第一篇文章,我是 Django 的新手,希望您能理解。
我想使用 Django 提供一个带有身份验证的门户,它必须使用 Keystone/Openstack API 来创建/删除项目、授予/删除权限。
Openstack 提供了一个 RestFul API,我必须在其上进行身份验证(我提供凭据,然后接收回令牌)。
我有 2 种可能性来访问此 API:
- 使用 python 客户端:python-keystoneclient
- 直接使用restful API
不要介意选项 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?
我确定我不是这个用例中的第一个,不管远程 API 是什么。但是我在谷歌上搜索了很多都没有找到合适的方法。也许我没有用正确的词搜索
谢谢你的帮助。
【问题讨论】:
标签:
django
api
session
openstack
keystone
【解决方案1】:
我是这样做的,效果很好:
在 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)
在我看来,我现在可以通过以下方式访问“共享变量”:
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)
我希望这可以帮助某人。