【问题标题】:Django with a custom view decorator causing "Page not redirecting properly"带有自定义视图装饰器的 Django 导致“页面未正确重定向”
【发布时间】:2015-09-25 15:16:43
【问题描述】:

我正在尝试为 Django 中的基于类的视图编写自定义装饰器。我想检查一个特定条件,即用户被列为场景对象的所有者。我已经编写了装饰器,如果用户是所有者,它可以正常工作 - 它允许用户正确地继续访问页面。但是,如果用户不是所有者,我会收到“此页面未正确重定向”错误。

这是我的装饰器:

def scene_is_yours(function):
    def wrap(request, *args, **kwargs):
        pk = kwargs.get('pk')
        scene = Scene.objects.get(id=pk)
        if not (scene.user.id == request.user.id):
            return HttpResponseRedirect('project-mine') 
        return function(request, *args, **kwargs)
    return wrap

这是我的看法:

class SceneUpdateView(TemplateView):
    model = Scene
    fields = ['name', 'short_name', 'description']
    template_name = 'scene/edit.html'

    @method_decorator(login_required)
    @method_decorator(scene_is_yours)
    def dispatch(self, *args, **kwargs):
        return super(SceneUpdateView, self).dispatch(*args, **kwargs)

我的回溯就是重复的这两行:

[07/Jul/2015 22:10:35]"GET /accounts/login/?next=/scenes/1/edit/ HTTP/1.1" 302 0
[07/Jul/2015 22:10:35]"GET /scenes/1/edit/ HTTP/1.1" 302 0

我尝试删除 login_required 装饰器,但没有效果。我正在测试的用户帐户已登录,所以我无法弄清楚为什么它试图让我登录然后返回装饰视图。怎么回事?

【问题讨论】:

    标签: django


    【解决方案1】:

    尝试从 functools 包装装饰器,也许你应该重命名函数变量, 也许你应该使用 django urlresolvers:

    from functools import wraps
    from django.core.urlresolvers import reverse
    ...
        def scene_is_yours(view_function): 
            @wraps(view_function)
            def wrap(request, *args, **kwargs):
                pk = kwargs.get('pk')
                scene = Scene.objects.get(id=pk)
                if not (scene.user.id == request.user.id):
                    return HttpResponseRedirect(reverse('project-mine')) 
                return view_function(request, *args, **kwargs)
            return wrap
    

    【讨论】:

    • 感谢您的回复。不幸的是,仍然出现同样的错误。
    猜你喜欢
    • 2014-06-07
    • 2011-10-16
    • 2021-11-25
    • 2015-03-25
    • 2018-06-17
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    相关资源
    最近更新 更多