mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-04 12:30:11 +03:00
Mark for transaction rollback after APIException occurs
This commit is contained in:
parent
21a0a826bb
commit
05cc9e7756
|
@ -99,6 +99,18 @@ def get_concrete_model(model_cls):
|
||||||
return model_cls
|
return model_cls
|
||||||
|
|
||||||
|
|
||||||
|
def set_rollback(transaction):
|
||||||
|
if hasattr(transaction, 'set_rollback'):
|
||||||
|
# If running in >=1.6 then mark a rollback as required,
|
||||||
|
# and allow it to be handled by Django.
|
||||||
|
transaction.set_rollback(True)
|
||||||
|
elif transaction.is_managed():
|
||||||
|
# Otherwise handle it explicitly if in managed mode.
|
||||||
|
if transaction.is_dirty():
|
||||||
|
transaction.rollback()
|
||||||
|
transaction.leave_transaction_management()
|
||||||
|
|
||||||
|
|
||||||
# View._allowed_methods only present from 1.5 onwards
|
# View._allowed_methods only present from 1.5 onwards
|
||||||
if django.VERSION >= (1, 5):
|
if django.VERSION >= (1, 5):
|
||||||
from django.views.generic import View
|
from django.views.generic import View
|
||||||
|
|
|
@ -4,11 +4,12 @@ Provides an APIView class that is the base of all views in REST framework.
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from django.core.exceptions import PermissionDenied
|
from django.core.exceptions import PermissionDenied
|
||||||
|
from django.db import transaction
|
||||||
from django.http import Http404
|
from django.http import Http404
|
||||||
from django.utils.datastructures import SortedDict
|
from django.utils.datastructures import SortedDict
|
||||||
from django.views.decorators.csrf import csrf_exempt
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
from rest_framework import status, exceptions
|
from rest_framework import status, exceptions
|
||||||
from rest_framework.compat import smart_text, HttpResponseBase, View
|
from rest_framework.compat import set_rollback, smart_text, HttpResponseBase, View
|
||||||
from rest_framework.request import Request
|
from rest_framework.request import Request
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.settings import api_settings
|
from rest_framework.settings import api_settings
|
||||||
|
@ -368,6 +369,8 @@ class APIView(View):
|
||||||
if response is None:
|
if response is None:
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
# We've swallowed the exception, but we should mark it for rollback.
|
||||||
|
set_rollback(transaction)
|
||||||
response.exception = True
|
response.exception = True
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user