[英]ATOMIC_REQUEST and Transactions in Django 1.6
给出以下代码:
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()
根据我对Django 1.6中事务的理解,如果do_stuff抛出异常,比如说IntegrityError,那么事务将被正确回滚。 但是,由于Django本身正在调用视图,因此不会阻止IntegrityError上升调用堆栈并导致HTTP 500错误吗? 让我们假设这不是我们想要的,因为我们希望优雅地处理错误,但仍然获得回滚功能。
所以我想明显的想法是好的,不要这样做,使用transaction.atomic
作为一个上下文管理器,包含在try块中,如下例所示:
try:
with transaction.atomic():
generate_relationships()
except IntegrityError:
handle_exception()
精细。 但是如果你想通过在db config中设置ATOMIC_REQUEST = True来使用每个HTTP请求的事务功能,这意味着django实际上只是将transaction.atomic
decorate添加到你的视图中,这将不会捕获任何异常。 ATOMIC_REQUEST如何有用? 为什么你想让你的数据库错误一直传播给用户?
所以我的问题是。
urls.hadler500
或者我应该实现一些中间件来捕获错误? 你的理解是正确的。 你所缺少的是让异常从你的视图代码传播(这与“一直传播到用户”完全不同)在Django中是完全正常的事情。
您可以通过制作500.html模板 ,重写handler500或制作自己的自定义中间件来自定义生成的行为。 在所有这些标准情况下,使用ATOMIC_REQUESTS
将执行您希望它执行的操作。
如果你想在视图代码中捕获异常并专门处理它们,你当然可以这样做,你只需要指定如何手动处理事务。 使用ATOMIC_REQUESTS
只是为常见情况保存一些样板的一种方法,同时允许您自己在不常见的情况下自定义行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.