custom.methods.wrap не возвращал объект HttpResponse. Вместо этого он вернулся - PullRequest
1 голос
/ 15 марта 2020

Что не так в моем коде ..?
Я возвращаю 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.

1 Ответ

1 голос
/ 15 марта 2020

Ваша декорированная функция не будет ничего возвращать (следовательно, None), если request.user.role как 'admin', но имеет .institute с .device, или роль не admin, и она также не является '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'))
            <b>return view_func(request, *args, **kwargs)</b>
        return wrap
    return decorator

Сочетание HttpResponseRedirect и reverse является redirect(..) [Django -док] . Таким образом, вы можете упростить ваш декоратор с помощью:

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 <b>redirect(</b>'accounts:add_institute'<b>)</b>
                elif not hasattr(request.user.institute, 'device'):
                    messages.add_message(
                        request, messages.WARNING, "Please Add Your Attendance Device Information")
                    return <b>redirect(</b>'accounts:device'<b>)</b>
            elif request.user.role == 'employee':
                return <b>redirect(</b>'accounts:profile'<b>)</b>
            return view_func(request, *args, **kwargs)
        return wrap
    return decorator
...