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

如何在python中持久化单个经过身份验证的请求会话?,python,python-requests,Python,Python Requests,我正在使用pythonrequests库与api交互 我首先进行身份验证,获取一个会话id,然后创建一个请求会话,以保持该连接 因此,我创建了一个类来执行此操作,但每次使用该类时,我都会重新初始化并再次执行身份验证。这是我想要避免的。 本质上,我在使用DRF调用的API之间创建了一个API。 我如何确保整个应用程序中只使用1个经过身份验证的会话,并且它通过多个请求持续存在 班级: class RestClient: session = None def create_rest

我正在使用python
requests
库与api交互

我首先进行身份验证,获取一个
会话id
,然后创建一个请求
会话
,以保持该连接

因此,我创建了一个类来执行此操作,但每次使用该类时,我都会重新初始化并再次执行身份验证。这是我想要避免的。 本质上,我在使用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()
使用类实例化并获取客户机(自然地重做身份验证)。我认为这应该是全球性的,或者是单身

使用类:

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())

我会把这样一处房产连接起来:

类RestClient:
_会话=无
@财产
def会话(自我):
如果是自会话:
返回self.\u会话
auth=requests.auth.HTTPBasicAuth(用户名、密码)
response=requests.post(
f“https://{settings.HOST}/rest/session”,auth=auth
)
会话=请求。会话()
session_id=response.json().get(“值”)
更新({“api会话id”:会话id})
self.\u session=会话
返回会话
现在,您只需执行
client.session
,它将在第一次访问时设置,然后重新使用


编辑:若要在
RestClient
实例之间保持此状态,请将对
self.\u session
的引用更改为
RestClient.\u session
我将连接如下属性:

类RestClient:
_会话=无
@财产
def会话(自我):
如果是自会话:
返回self.\u会话
auth=requests.auth.HTTPBasicAuth(用户名、密码)
response=requests.post(
f“https://{settings.HOST}/rest/session”,auth=auth
)
会话=请求。会话()
session_id=response.json().get(“值”)
更新({“api会话id”:会话id})
self.\u session=会话
返回会话
现在,您只需执行
client.session
,它将在第一次访问时设置,然后重新使用



编辑:要在
RestClient
实例之间持久化此操作,将引用更改为<代码>自身>会话> <代码> >代码> RestCudio.x会话< /C> > < /P>任何原因,您不在<代码> RestCalue< /Cord>对象的实例上存储<代码>会话<代码>,只需将该实例传递到需要的地方?您可能还需要考虑创建一个继承自<代码>请求的自定义类。并相应地重写
\uuuuu init\uuuuu
,以发出更新其自身头的初始请求。。。然后把这个对象传递出去,把它当作是任何其他的
请求。Session
对象…听起来不错。我更新了问题中的用法,以表明我这样做是为了响应对api的调用。我只是不确定在
位上是否传递对象。你能举个例子吗?你有没有看过Django是如何管理它在整个框架中建立一个DB连接的?我相信重新阅读你的问题,那就是你想做的事情吗?你为什么不在<代码> RestCalue< /Cord>对象的实例中存储<代码>会话<代码>,并只在需要的地方传递那个实例?你可能还想考虑创建一个继承自<代码>请求的自定义类。相应地重写
\uuuuu init\uuuuuu
,以发出更新其自身标头的初始请求。。。然后把这个对象传递出去,把它当作是任何其他的
请求。Session
对象…听起来不错。我更新了问题中的用法,以表明我这样做是为了响应对api的调用。我只是不确定在
位上是否传递对象。你能举个例子吗?你有没有看过Django是如何管理它在整个框架中建立一个DB连接的?我相信你在读你的问题,这正是你想做的事情?那真的很好,谢谢。虽然它不会像我每次使用它时那样持久化,但它必须再次验证。如果您创建一次
客户端
对象,它应该持久化。添加了一个关于将其持久化为类变量的编辑。
self
指的是您用
RestClient()
实例化的
RestClient
的实例
RestClient
指类
RestClient
。在类对象上设置一个属性(
\u session
)实际上是一个全局属性,但在类中有名称空间。当会话过期时,您可以使用
RestClient刷新它。\u session=None
,因此下次调用
.session
将获得一个带有新令牌的新会话。还值得将
requests.Session
本身子类化,并将此自动刷新添加到
request()
方法中。这将非常好地整理它,谢谢。虽然它不会像我每次使用它时那样持久化,但它必须再次验证。如果您创建一次
客户端
对象,它应该持久化。添加了一个关于将其持久化为类变量的编辑。
self
指的是您用
RestClient()
实例化的
RestClient
的实例
RestClient
指类
RestClient
。在类对象上设置一个属性(
\u session
)实际上是一个全局属性,但在类中有名称空间。当会话过期时,您可以使用
RestClient刷新它。\u session=None
,因此下次调用
.session
将获得一个带有新令牌的新会话。还值得将
requests.Session
本身子类化,并将其添加到