0

J'ai une vue API Django Python REST comme ceci:Pourquoi les décorateurs de l'API REST de Django rompent-ils le décorateur Django non_atomic_requests?

from rest_framework.decorators import api_view, permission_classes 
from django.db import transaction 

@api_view([ 'POST' ]) 
@permission_classes((IsAuthenticated,)) 
@transaction.non_atomic_requests 
def myview(request): 
    with transaction.atomic(): 
     db_do_something1() 

    with transaction.atomic(): 
     do_do_something2() 

    return some_response 

Le SQL fait courir contre ma base de données PostgreSQL dans ce cas crée savepoints avant et après db_do_something1 et 2 - mais critique ne commettras pas après avoir quitté la avec des blocs.

La vue entière est toujours entourée d'un BEING et COMMIT est uniquement envoyée à la base de données à la fin de la vue.

Si je déplace le décorateur @transaction.non_atomic_requests au début de la liste des décorateurs, alors j'obtiens le comportement correct, chaque bloc with étant dans sa propre transaction et validant à la fin.

Que se passe-t-il ici?

Répondre

1

api_view crée un APIView derrière la scène. Selon l'endroit où l'transaction.non_atomic_requests est appelé, il pourrait être ajouté à la mauvaise fonction (comme le as_view au lieu de myview.

La documentation peut avoir besoin d'une mise à jour pour mettre un peu l'accent là-dessus. Je ne me souviens pas que ce soit déjà signalé