【问题标题】:Strange decorator result on related object comparison相关对象比较的奇怪装饰器结果
【发布时间】:2009-11-11 17:52:01
【问题描述】:

在允许更新/删除对象的视图上,我需要一个装饰器来验证要编辑的对象是否属于一个组(模型“loja)。两者都在 url 中定义:

/[slug model loja--s_loja]/[viewname-ex:addmenu]/[object id--obj_id]

由于对象的模型可以变化,装饰器将对象的模型作为参数。每个可以作为参数传递的模型都有一个名为 loja 的模型“loja”的外键。

装饰者:

def acesso_objecto(modelo):
    def wrap(f):
        def wrapper(*args, **kwargs):
            s_loja = kwargs['s_loja']
            obj_id = kwargs['obj_id']
            objecto = get_object_or_404(modelo, pk=obj_id)
            loja = get_object_or_404(Loja, slug=s_loja)
            if objecto.loja is not loja:
                raise Http404
            else:
                return f(*args, **kwargs)
        return wrapper
    return wrap

基本上,除非组“loja”和对象存在并且对象属于该组,否则应该引发 404 错误。

没有装饰器,视图工作正常,但装饰器总是引发 404,因为 if 语句总是正确的,即使它不应该是。如果我使用 loja.id 或 loja.slug 进行验证,它会与它们相关,但此功能似乎总是失败,我不知道为什么。

【问题讨论】:

    标签: python django decorator


    【解决方案1】:

    is not 替换为!=

    not loja 正在评估 True,而 if 语句正在测试 objecto.lojaTrue 之间的相等性。

    【讨论】:

    • 嗯,这很愚蠢。我认为 is 与 != 不同,但我不确定 loja 是否评估为 True。这与文档相反。来自 python 文档:“运算符是和不是对象身份测试:当且仅当 x 和 y 是同一个对象时,x 是 y 为真。x 不是 y 产生反真值。”然后作为脚注:“由于自动垃圾收集、空闲列表和描述符的动态特性,您可能会注意到 is 运算符的某些使用中看似不寻常的行为,例如涉及实例方法或常量之间比较的那些。”
    • 啊,你是对的,我对 is 运算符的看法是错误的。我应该像你一样引用文档。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    相关资源
    最近更新 更多