对于Django @ csrf_exempt,request.session始终为空

问题描述 投票:4回答:2

我被困在django中,如果有人可以帮助我,我将不胜感激。

我需要有一个第三方API的入口点。所以我创建了一个视图,并用@csrf_exempt

装饰了它

现在问题是我无法访问之前设置的任何会话变量。编辑-我设置了多个会话变量,例如用户电子邮件,以了解用户是否已经登录。我能够在调用第三方API之前使用该会话。当第三方API发送响应时,他们不发送CSRF令牌,因此我已将该视图从csrf中排除。收到有效回复后,我想更新数据库。为此,我需要知道丢失的用户的电子邮件ID,因为我已经没有会话变量了。

ppConfirmPaymentProcess是另一个处理由该第三方API发送的POST数据的函数。一切正常,csrf_exempt也正常工作,但是我无法对此请求执行request.session["foo"]。有人可以帮忙吗?

@csrf_exempt
def ppConfirmPayment(request):
    print(request.session, "=======================================")
    for key, value in request.session.items():
        print('{} => {}'.format(key, value))
    return ppConfirmPaymentProcess(request)
python django django-csrf
2个回答
0
投票

request.session将始终为空,因为它只能由您的系统初始化,并且一旦关闭连接,该会话将被销毁。对于新连接,设置了新会话。由于您的API端点是直接由第三方API触发的,而不会触发任何其他端点,因此第三方无法设置会话。因此,request.session为空。

尝试将信息存储在request.POST中,而不是request.session中,这是从第三方获取信息的最佳方式。


-1
投票

第三方API可能未以登录用户身份发送响应,并且肯定不是以发起事务的用户身份发送响应。

您可能必须在数据库中跟踪对API发出的请求以及与之关联的用户。从API获得响应后,您需要将其与这些记录进行匹配,加载相关用户的信息并进行适当的更新。

第三方API的响应与用户会话完全分开;这意味着它可能会在单独的线程,进程甚至服务器中进行处理(取决于您的网站设置方式),因此您需要使用某种跨越这些界限的机制,以便让用户了解付款的结果(这意味着数据库或为此设置的其他内容)。

© www.soinside.com 2019 - 2024. All rights reserved.