web-dev-qa-db-fra.com

Avec Django @csrf_exempt, request.session est toujours vide

Je suis coincé dans Django et j'apprécierais vraiment que quelqu'un puisse m'aider.

J'ai besoin d'un point d'entrée pour une API tierce. J'ai donc créé une vue et l'ai décorée avec @csrf_exempt

Maintenant, le problème est que je ne peux pas accéder aux variables de session que j'ai définies auparavant. modifier - J'ai défini plusieurs variables de session telles que l'e-mail de l'utilisateur pour savoir si un utilisateur est déjà connecté. J'ai pu utiliser la session avant d'appeler l'API tierce. Lorsque l'API tierce envoie une réponse, ils ne le font pas. t envoyer le jeton CSRF, donc j'ai exempté cette vue de csrf. Une fois que j'ai reçu une réponse valide, je veux mettre à jour ma base de données. Pour ce faire, j'ai besoin de connaître l'ID de messagerie de l'utilisateur que j'ai perdu car je n'ai pas de session variables plus.

ppConfirmPaymentProcess est une autre fonction qui traite les POST données envoyées par cette API tierce. Tout fonctionne bien, csrf_exempt fonctionne également bien mais je ne peux pas faire request.session["foo"] avec cette demande. Puis-je avoir une aide s'il vous plait?

@csrf_exempt
def ppConfirmPayment(request):
    print(request.session, "=======================================")
    for key, value in request.session.items():
        print('{} => {}'.format(key, value))
    return ppConfirmPaymentProcess(request)
8
GKV

Je l'ai résolu en utilisant Django lui-même. Aucune manipulation de session-id ou interaction avec la base de données.

Étape 1: appeler une API tierce

@login_required
def thirdPartyAPICall(request):
    #do some stuff and send a request to 3rd party

Étape 2: recevoir un rappel d'un tiers dans la vue. Notez comment je mets csrf_exempt et pas login_required afin que le tiers puisse envoyer une demande à mon application sans jeton CSRF et session. C'est comme un point d'entrée vers mon APP pour eux. Dans ce callBackView effectuez une action et vérifiez s'il s'agit bien d'une réponse valide de la part du tiers ou si quelqu'un essaie de pirater votre système. Par exemple. vérifier CHECKSUM ou TXNID etc, puis créer un dictionnaire de réponses et envoyer une autre réponse HTTP à une autre ressource en utilisant HttpResponseRedirect avec-dans mon application, puis j'ai passé le paramètre GET pertinent à il.

Cette étape particulière restaure ma session précédente et maintenant j'ai les données pertinentes du tiers pour traiter la demande que je leur ai envoyée et j'ai également récupéré mon session dans la demande.

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

J'aime le plus cette méthode car, comme je l'ai déjà mentionné, nous n'avons pas besoin de stocker la session, Django le fait pour nous.

0
GKV

Voir Docs: https://docs.djangoproject.com/en/3.0/topics/http/sessions/

Django stocke les données de session étiquetées sur la clé de session, comme ceci:
{"session_key": sdfkjdsbks, "user_email": "[email protected]"}

Imprimez et copiez la request.session.session_key lorsque vous stockez le courrier électronique de l'utilisateur et vérifiez si vous obtenez à nouveau la même session_key dans votre vue.

sinon, vous pouvez charger de force la session précédente dans la vue en utilisant la clé de session copiée:

from importlib import import_module
from Django.conf import settings

@csrf_exempt
def ppConfirmPayment(request):

    engine = import_module(settings.SESSION_ENGINE)

    # copy the old_session_key value from request when you saved user email
    request.session = engine.SessionStore(old_session_key)

    print(request.session, "=======================================")
    for key, value in request.session.items():
        print('{} => {}'.format(key, value))
    return ppConfirmPaymentProcess(request)

Si cela fonctionne, vous pouvez envoyer session_key à l'API tierce et leur demander d'envoyer la même clé de session à l'intérieur du cookie ou des données lors des appels suivants. Et capturez la clé de session et chargez la session avec force dans votre vue.

1
Rahul Sinha