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