使用 Django @csrf_exempt,request.session 始终为空

GKV*_*GKV 9 python django django-csrf

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

我需要一个第 3 方 API 的入口点。所以我创建了一个视图并用@csrf_exempt 装饰它

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

ppConfirmPaymentProcess是另一个处理由这个 3rd 方 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)
Run Code Online (Sandbox Code Playgroud)

GKV*_*GKV 0

我用 Django 本身解决了这个问题。不操纵会话 ID 或与数据库交互。

Step1:调用第3方API

@login_required
def thirdPartyAPICall(request):
    #do some stuff and send a request to 3rd party
Run Code Online (Sandbox Code Playgroud)

步骤2:在视图中接收来自第3方的回调。请注意我的放置方式csrf_exemptlogin_required以便第三方可以在没有 CSRF 令牌和会话的情况下向我的应用程序发送请求。对于他们来说,这就像我的应用程序的入口点。在此callBackView执行一些操作并检查这是否确实是来自第 3 方的有效响应或有人试图破解您的系统。例如,检查CHECKSUMTXNID等,然后创建一个响应字典,并使用HttpResponseRedirect我的应用程序中的 with- 将另一个 HTTP 响应发送到另一个资源,然后我将相关的 GET 参数传递给它。

这个特定的步骤恢复了我之前的会话,现在我有了来自第 3 方的相关数据来处理我发送给他们的请求,并且我也得到了session请求。

@csrf_exempt
def callBackView(request):
     if request.POST["CHECKSUM"] == myCalCulatedCheckSum:
          foo = True
     else:
          foo = False
     return HttpResponseRedirect("TEST.HTML" +"/" + str(foo))
Run Code Online (Sandbox Code Playgroud)

我最喜欢这种方法,因为正如我之前提到的,我们不需要存储会话,Django 为我们做了这件事。