【问题标题】:custom.methods.wrap didn't return an HttpResponse object. It returned None insteadcustom.methods.wrap 没有返回 HttpResponse 对象。它返回 None 而不是
【发布时间】:2020-06-26 22:49:44
【问题描述】:

我的代码有什么问题..?
我有条件地返回一个 HttpResponse,但我不断收到错误

decorators.py

def has_permission_view():
    def decorator(view_func):
        def wrap(request, *args, **kwargs):
            if request.user.role == 'admin':
                if not hasattr(request.user, 'institute'):
                    messages.add_message(
                        request, messages.WARNING, "Please Add Your Institute Information")
                    return HttpResponseRedirect(reverse('accounts:add_institute'))
                elif not hasattr(request.user.institute, 'device'):
                    messages.add_message(
                        request, messages.WARNING, "Please Add Your Attendance Device Information")
                    return HttpResponseRedirect(reverse('accounts:device'))
            elif request.user.role == 'employee':
                return HttpResponseRedirect(reverse('accounts:profile'))
        return wrap
    return decorator

views.py

@login_required
@has_permission_view()
def index(request):
    context = {}
    d = request.user.institute.device
    zk = ZK(d.ip, d.port, timeout=5, password=0, force_udp=False, ommit_ping=False)
    try:
        conn = zk.connect()
        context['object'] = conn
    except Exception as e:
        messages.add_message(request, messages.WARNING, e)
    return render(request, 'index.html', context)

我收到此错误消息 The view custom.methods.wrap didn't return an HttpResponse object. It returned None instead.

【问题讨论】:

  • 如果 1request.user.role` 不是 'admin' 而不是 employee 怎么办?
  • @WillemVanOnsem 如果 'request.user.role 不是 adminemployee 它应该根据视图条件呈现模板
  • @RiajulHashem: 但在elsif 下方没有else 用于角色检查。
  • @WillemVanOnsem 我知道这就是问题所在,但我如何才能从else 语句返回视图(例如:索引视图)

标签: django django-views


【解决方案1】:

如果request.user.role'admin',但有一个.institute.device,或者角色不是admin,你的装饰函数将不会返回任何内容(因此None)也不是'employee'

如果不执行重定向,则需要返回包装函数的结果:

def has_permission_view():
    def decorator(view_func):
        def wrap(request, *args, **kwargs):
            if request.user.role == 'admin':
                if not hasattr(request.user, 'institute'):
                    messages.add_message(
                        request, messages.WARNING, "Please Add Your Institute Information")
                    return HttpResponseRedirect(reverse('accounts:add_institute'))
                elif not hasattr(request.user.institute, 'device'):
                    messages.add_message(
                        request, messages.WARNING, "Please Add Your Attendance Device Information")
                    return HttpResponseRedirect(reverse('accounts:device'))
            elif request.user.role == 'employee':
                return HttpResponseRedirect(reverse('accounts:profile'))
            return view_func(request, *args, **kwargs)
        return wrap
    return decorator

HttpResponseRedirectreverse 的组合是redirect(..) [Django-doc]。因此,您可以通过以下方式简化您的装饰器:

from django.shortcuts import redirect

def has_permission_view():
    def decorator(view_func):
        def wrap(request, *args, **kwargs):
            if request.user.role == 'admin':
                if not hasattr(request.user, 'institute'):
                    messages.add_message(
                        request, messages.WARNING, "Please Add Your Institute Information")
                    return redirect('accounts:add_institute')
                elif not hasattr(request.user.institute, 'device'):
                    messages.add_message(
                        request, messages.WARNING, "Please Add Your Attendance Device Information")
                    return redirect('accounts:device')
            elif request.user.role == 'employee':
                return redirect('accounts:profile')
            return view_func(request, *args, **kwargs)
        return wrap
    return decorator

【讨论】:

  • @Wilem Van Onsem 谢谢 :)
猜你喜欢
  • 2019-10-13
  • 2019-06-12
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
相关资源
最近更新 更多