簡體   English   中英

如何在python中持久保存一個經過身份驗證的請求會話?

[英]How can you persist a single authenticated requests session in python?

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

我將這樣連接一個屬性:

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._sessionRestClient._session

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM