如何在python中持久保存一个经过身份验证的请求会话?

时间:2019-03-22 08:40:37

标签: python python-requests

我正在使用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())

1 个答案:

答案 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