我有一个函数a()个,它以这种方式调用其他函数b()个、c()d()(我将其图式化):

a()

def a(request):
    try:
        b(request)
    except Exception:
        messages.error(request, 'error')
    try:
        c(request)
    except Exception:
        messages.error(request, 'error')
    try:
        d(request)
    except Exception:
        messages.error(request, 'error')
    return redirect('namespace:url_name')

b()

def b(request):
    try:
        do_something()
        messages.success(request, 'I did')
    except Exception:
        messages.error(request, 'Couldn\'t do the thing')
        return redirect('namespace:url_name')

But if an exception triggers in b()个 , its redirection doesn't work and c() and d() are still executed in a()个.

我是不是在redirectexception handling的理解中漏掉了什么? 因为即使我在所有a个函数的异常中都设置了redirect,行为也不会改变.

推荐答案

您不会在a中返回b的结果,因此,无论b返回什么,它仍然会处理cd.return redirect会返回,但它会从b中返回,它不会从b的调用者中返回,这没有多大意义.

因此,我们应该判断b是否返回某些东西,如果是,则返回结果,否则继续:

def a(request):
    try:
        result = b(request)
        if result is not None:
            return result
    except Exception:
        messages.error(request, 'error')
    try:
        result = c(request)
        if result is not None:
            return result
    except Exception:
        messages.error(request, 'error')
    try:
        result = d(request)
        if result is not None:
            return result
    except Exception:
        messages.error(request, 'error')
    return redirect('namespace:url_name')

Django相关问答推荐

Django显示交叉表格

django re_path() 函数模式与包含该模式的 url 不匹配

Django REST框架中如何从另一个视图调用API视图?

如何在视图中的 Django 重定向末尾附加字符串?

Django:获取每组最新的N条记录

data._mutable= 在 Django REST 框架中为真

如何使用 matplotlib 在绘图的角落插入小图像?

Django:无法从另一个应用程序导入模型

直接在Django的模板中访问ForeignKey

Django ModelForm 没有指定模型类

在 Django 网站上找不到页面 404?

jinja2模板引擎中的这个-是做什么的?

django - 如何使翻译工作?

如何使用基于类的视图处理表单(通过 get 或 post)?

Celery 和 Django 简单示例

在 Django 中使用 Cython,是否有意义?

如何找到两个 Django 查询集的交集?

登录后django重定向不起作用next不发布?

如何将本地文件分配给 Django 中的 FileField?

确保只有一个工作人员在运行多个工作人员的 pyramid 网络应用程序中启动 apscheduler 事件