我正在使用python requests
库与api交互。
我首先进行身份验证,获得一个session-id
,然后创建一个请求session
来保持该连接。
因此,我创建了一个类来执行此操作,但是每次使用该类时,都会重新初始化并再次进行身份验证。我想避免。 本质上,我在使用DRF调用的API之间创建了一个API。 如何确保整个应用程序仅使用1个经过身份验证的会话,并且该会话在多个请求中都可以持续存在?
课程:
class RestClient:
session = None
def create_rest_client(self):
auth = requests.auth.HTTPBasicAuth(
USERNAME,
PASSWORD
)
response = requests.post(
f'https://{ settings.HOST }/rest/session',
auth=auth
)
session = requests.Session()
session_id = response.json().get('value')
session.headers.update({'api-session-id': session_id})
return session
def get_rest_client(self):
if self.session:
return self.session
else:
return self.create_rest_client()
使用该类实例化并获取客户端(自然重做auth)。我认为这应该是全局的或单例的。
使用课程:
class ProductDetail(APIView):
def get(self, request, format=None, **kwargs):
response = []
rest_client = RestClient()
session = rest_client.get_rest_client()
response = session.get(
....use authenticated session
)
return Response(response.json())
答案 0 :(得分:1)
我将连接一个像这样的属性:
class RestClient:
_session = None
@property
def session(self):
if self._session:
return self._session
auth = requests.auth.HTTPBasicAuth(USERNAME, PASSWORD)
response = requests.post(
f"https://{ settings.HOST }/rest/session", auth=auth
)
session = requests.Session()
session_id = response.json().get("value")
session.headers.update({"api-session-id": session_id})
self._session = session
return session
现在,您只需执行client.session
,它将在第一次访问时进行设置,然后在以后重用。
编辑:要在 RestClient
实例之间保留此,请将对self._session
的引用更改为RestClient._session
。