• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
    • Questions
    • Teachers
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

385
Views
Con Django @csrf_exempt, request.session siempre está vacía

Estoy atascado en django y realmente agradecería si alguien pudiera ayudarme.

Necesito tener un punto de entrada para una API de terceros. Así que creé una vista y la decoré con @csrf_exempt

Ahora el problema es que no puedo acceder a las variables de sesión que configuré antes. editar: configuré varias variables de sesión, como el correo electrónico del usuario, para saber si un usuario ya inició sesión. Pude usar la sesión antes de llamar a la API de terceros. Cuando la API de terceros envía una respuesta, no envía el token CSRF, por lo tanto, he exento esa vista de csrf. Una vez que reciba una respuesta válida, quiero actualizar mi base de datos. Para hacer eso, necesito saber la identificación de correo electrónico del usuario que perdí porque ya no tengo variables de sesión.

ppConfirmPaymentProcess es otra función que procesa los datos POST enviados por esta API de terceros. Todo funciona bien, csrf_exempt también funciona bien, pero no puedo hacer request.session["foo"] con esta solicitud. ¿Puede ayudarme alguien, por favor?

 @csrf_exempt def ppConfirmPayment(request): print(request.session, "=======================================") for key, value in request.session.items(): print('{} => {}'.format(key, value)) return ppConfirmPaymentProcess(request)
about 3 years ago · Santiago Trujillo
4 answers
Answer question

0

Es probable que la API de terceros no envíe la respuesta como un usuario que ha iniciado sesión y, desde luego, no como el usuario que inició la transacción.

Deberá realizar un seguimiento de las solicitudes que ha realizado a la API y con qué usuario están asociadas, probablemente en la base de datos. Cuando obtenga una respuesta de la API, deberá compararla con esos registros, cargar la información del usuario relevante y realizar la actualización correspondiente.

La respuesta de la API de terceros es completamente independiente de la sesión del usuario; esto significa que probablemente se procesará en un hilo, proceso o incluso servidor separado (dependiendo de cómo esté configurado su sitio), por lo que deberá usar algún mecanismo que cruce estos límites para que el usuario sepa sobre el resultado del pago (lo que significa la base de datos o cualquier otra cosa que haya configurado para esto).

about 3 years ago · Santiago Trujillo Report

0

request.session siempre estará vacía porque solo puede ser inicializada por su sistema y una vez que se cierra la conexión, la sesión se destruye . Para una nueva conexión, se establece una nueva sesión. Dado que la API de terceros activa directamente el punto final de su API sin activar ningún otro punto final, no hay forma de que el tercero pueda configurar las sesiones. Por lo tanto, request.session está vacío.


Intente almacenar la información en request.POST en lugar de request.session, que es una forma más óptima de obtener información de terceros.

about 3 years ago · Santiago Trujillo Report

0

Ver documentos: https://docs.djangoproject.com/en/3.0/topics/http/sessions/

Django almacena los datos de la sesión etiquetados en la clave de la sesión, algo así:
{"session_key":sdfkjdsbks, "user_email":"abc@df.com"}

Imprima y copie request.session.session_key cuando esté almacenando el correo electrónico del usuario y verifique si está obteniendo la misma session_key dentro de su vista nuevamente.

de lo contrario, puede cargar a la fuerza la vista interior de la sesión anterior utilizando la clave de sesión copiada:

 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 esto funciona, puede enviar session_key a la API de terceros y solicitarles que envíen la misma clave de sesión dentro de la cookie o los datos en llamadas posteriores. Y capture la clave de sesión y cargue con fuerza la sesión dentro de su vista.

about 3 years ago · Santiago Trujillo Report

0

Lo resolví usando el propio Django. Sin manipulación de ID de sesión o interacción con la base de datos.

Paso 1 : llame a la API de terceros

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

Paso 2 : reciba una devolución de llamada de un tercero en la vista. Tenga en cuenta cómo puse csrf_exempt y no login_required para que un tercero pueda enviar una solicitud a mi aplicación sin el token CSRF y la sesión. Es como un punto de entrada a mi aplicación para ellos. En este callBackView , realice alguna acción y verifique si esta es una respuesta válida del tercero o si alguien está tratando de piratear su sistema. Por ejemplo, verifique CHECKSUM o TXNID etc. y luego cree un diccionario de respuesta y envíe otra respuesta HTTP a otro recurso usando HttpResponseRedirect dentro de mi aplicación y luego le pasé el parámetro GET relevante.

Este paso en particular restaura mi sesión anterior y ahora tengo los datos relevantes del tercero para procesar la solicitud que les envié y también recuperé mi session en la solicitud.

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

Me gusta más este método porque, como mencioné antes, no necesitamos almacenar la sesión, Django lo hace por nosotros.

about 3 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error