2015-07-21 8 views
8

Ich habe ein Projekt mit Django REST Framework von einer 2.x-Version auf die letzte stabile Version (3.1.3) aktualisiert. Nachdem ich einige veraltete Verwendungen in meinen Serializern behoben hatte, habe ich python manage.py test ausgeführt, um sicherzustellen, dass nichts kaputt gegangen ist.Transaktionsfehler, wenn Django REST Framework absichtlich einen Fehler auslöst

Alles funktioniert gut, außer einigen meiner Tests, wo ich ungültige REST-Anfragen (absichtlich) teste. Zum Beispiel:

def test_get_events_of_other_user(self): 
    # Assume the setUp log the user1 with self.client 
    # and here, there is some code initializing an 
    # event for user2 
    response = self.client.get("/event/123/") 
    self.assertEqual(404, response.status_code) 

Die Viewset einer ORM-Abfrage wie MyEventModel.objects.get(user=request.user, pk=123) erzeugt, die offensichtlich eine 404-Ausnahme in DRF aufwirft, da sollte kein Objekt hier zurückgegeben wird (ich weiß, es sollte ein 403 seinen REST zu sein -konform ...). Aber dies wirft ein TransactionManagementError:

Traceback (most recent call last): 
    [...] 
    File "/my_virtual_env_path/local/lib/python2.7/site-packages/rest_framework/viewsets.py", line 85, in view 
    return self.dispatch(request, *args, **kwargs) 
    File "/my_virtual_env_path/local/lib/python2.7/site-packages/rest_framework/views.py", line 456, in dispatch 
    response = self.handle_exception(exc) 
    File "/my_virtual_env_path/local/lib/python2.7/site-packages/rest_framework/views.py", line 421, in handle_exception 
    response = exception_handler(exc, context) 
    File "/my_virtual_env_path/local/lib/python2.7/site-packages/rest_framework/views.py", line 81, in exception_handler 
    set_rollback() 
    File "/my_virtual_env_path/local/lib/python2.7/site-packages/rest_framework/compat.py", line 277, in set_rollback 
    transaction.set_rollback(True) 
    File "/my_virtual_env_path/local/lib/python2.7/site-packages/django/db/transaction.py", line 215, in set_rollback 
    return get_connection(using).set_rollback(rollback) 
    File "/my_virtual_env_path/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 372, in set_rollback 
    "The rollback flag doesn't work outside of an 'atomic' block.") 
TransactionManagementError: The rollback flag doesn't work outside of an 'atomic' block. 

Es sieht aus wie eine meiner Middleware ist eine SQL-Abfrage nach der Ansicht tun, und drücken Sie die transaction closed by DRF, since the 3.1.3. Das gewünschte Verhalten (d. H. Ein 404 nicht gefunden) funktioniert mit dem 3.1.2 ...

Hat jemand eine Idee, wie ich das Rollback vermeiden könnte? Ist es ein Missverständnis in DRF?

Antwort

2

Das sieht wie ein Fehler in DRF aus, der bereits behoben wurde. Wie Sie sehen können here haben sie den Code geändert, so dass es nur zurückrollt, wenn in einem atomaren Block.

Da keine neuere Version veröffentlicht wurde, können Sie das gleiche Update auf Ihren installierten Code anwenden oder eine frühere Version verwenden, bis 3.1.3 ersetzt wurde.

+0

In der Tat funktioniert es mit diesem Update. Ich werde weiterhin die Version 3.1.2 verwenden, bis die Version 3.1.4 verfügbar ist. Danke für den Link! –

Verwandte Themen