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?
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! –